1

我对这篇文章有一个后续问题。我想获取 Excel 电子表格的内容并将其放入一个元组数组中,其中每个元组对应于电子表格中的每一行。

我开始像这样循环整个范围:

    let path = "XXX.xlsx"
    let app = ApplicationClass(Visible = false)
    let book = app.Workbooks.Open path
    let sheet = book.Worksheets.[1] :?> _Worksheet
    let content = sheet.UsedRange.Value2 :?> obj[,]
    for i=content.GetLowerBound(0) to content.GetUpperBound(0) do
        for j=content.GetLowerBound(1) to content.GetUpperBound(1) do

但让我觉得效率很低。如果我可以使用开箱即用的基本 API 规范中的某些内容?

提前致谢

4

3 回答 3

0

Array2D模块实现了二维数组的一些常用功能。

我猜你想使用Array2D.iterArray2D.iteri替换你的 for 循环。

于 2013-06-04T12:34:30.820 回答
0

另一种选择是完全绕过 Excel 引擎。有几种方法可以做到这一点,但我取得了巨大成功的是“SpreadsheetGear”。它不是免费的(投反对票),但它非常接近地复制了 Excel API,而且速度非常快。

于 2013-06-05T12:53:51.843 回答
0

将每一行(二维数组)转换为元组(在一维行中)的直接方法是完成您开始的操作 - 只需遍历所有行并构造一个元组:

let tuples = 
  [ for i in contents.GetLowerBound(0) .. contents.GetUpperBound(0) -> 
      contents.[i,0], contents.[i,1], contents.[i,2] ]

为此,您需要(静态地)知道行的长度是多少。这是因为 F# 元组是固定长度的元组,并且会检查长度。上面的示例假设只有 3 个元素具有索引0和。如果长度是动态的,那么您可能应该继续使用二维数组而不是元组列表。12

于 2013-06-04T12:50:12.813 回答