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モジュールは、2D 配列の一般的な関数をいくつか実装しています。

forループを使用Array2D.iterまたは交換したいと思います。Array2D.iteri

于 2013-06-04T12:34:30.820 に答える
0

もう 1 つのオプションは、Excel エンジンを完全にバイパスすることです。これを行うにはいくつかの方法がありますが、私が大成功を収めたのは「SpreadsheetGear」です。無料ではありませんが (反対票を投じます)、Excel API を非常に厳密に複製し、非常に高速です。

于 2013-06-05T12:53:51.843 に答える
0

(2 次元配列の) 各行を (1 次元行の) タプルに変換する簡単な方法は、開始したことを完了することです。すべての行を反復処理して、タプルを構築するだけです。

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

これを行うには、行の長さを (静的に) 知る必要があります。これは、F# のタプルが固定長のタプルであり、長さがチェックされるためです。上記の例では、インデックス01およびを持つ要素が 3 つだけあると仮定してい2ます。長さが動的な場合は、タプルのリストではなく 2D 配列を引き続き使用する必要があります。

于 2013-06-04T12:50:12.813 に答える