我在this帖子上有一个跟进问题。我想获取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规范中的某些内容?
提前致谢
答案 0 :(得分:0)
Array2D
模块实现了2D数组的一些常用功能。
我猜您要使用Array2D.iter
或Array2D.iteri
来替换您的for循环。
答案 1 :(得分:0)
将每行(二维数组)转换为元组(在一维行中)的简单方法是完成开始 - 只是迭代所有行并构造一个元组:
let tuples =
[ for i in contents.GetLowerBound(0) .. contents.GetUpperBound(0) ->
contents.[i,0], contents.[i,1], contents.[i,2] ]
为此,您需要(静态地)知道行的长度。这是因为F#元组是固定长度的元组并且检查长度。上面的示例假设只有3个元素具有索引0
,1
和2
。如果长度是动态的,那么您可能应该继续使用2D数组而不是元组列表。
答案 2 :(得分:0)
另一种选择是完全绕过Excel引擎。有几种方法可以做到这一点,但我取得巨大成功的是'SpreadsheetGear'。它不是免费的(引入downvotes),但它非常接近地复制Excel API并且非常快。