2

F# で Microsoft.Office.Interop.Excel を使用して、エンド ユーザー向けに CSV ファイルを開いて Excel ブックに変換する操作を自動化しています。

整数を使用して F# で OpenText() 呼び出しのフィールド情報パラメーターを指定すると、整数の使用に関する実行時の苦情が表示されます。整数は XlColumnDataTypes ではありません。

let fieldInfo = [| [|1;2|] ; [|2;2|] ; [|3;1|] ; [|4;1|] ; [|5;1|] ; [|6;1|] ; [|7;1|] ; [|8;1|] |]
let xl = ApplicationClass()
xl.Workbooks.OpenText(fileName, StartRow=1, DataType=XlTextParsingType.xlDelimited,
                      TextQualifier=XlTextQualifier.xlTextQualifierNone, Comma=true,
                      FieldInfo=fieldInfo)
let wb = xl.Workbooks.Item(1)

エラー: SafeArrayTypeMismatchException が処理されませんでした: 指定された配列は予期された型ではありませんでした。

しかし、XlColumnDataTypes を指定すると、コンパイル時に、整数を使用していないという苦情が寄せられます。

let fieldInfo = [| [|1;XlColumnDataType.xlTextFormat|];
                   [|2;XlColumnDataType.xlTextFormat|];
                   [|3;XlColumnDataType.xlGeneralFormat|];
                   [|4;XlColumnDataType.xlGeneralFormat|];
                   [|5;XlColumnDataType.xlGeneralFormat|];
                   [|6;XlColumnDataType.xlGeneralFormat|];
                   [|7;XlColumnDataType.xlGeneralFormat|];
                   [|8;XlColumnDataType.xlGeneralFormat|] |]

エラー: この式は int 型であると予想されていましたが、ここでは XlColumnDataType 型です。

他の誰かがこれを見たことがありますか?誰もこれを回避する方法を知っていますか?

ありがとう!

4

1 に答える 1

2

CSVのフィールド情報の引数は、次のスニペットの値のように、要素OpenText()の 2 次元配列である必要があります ( Excel 相互運用の詳細については、こちらを参照してください)。System.Objectobj[,]fieldInfo

open Microsoft.Office.Interop.Excel

[<EntryPoint>]
let main argv =
    let fieldInfo: obj[,] = Array2D.zeroCreate 2 2
    fieldInfo.[0,0] <- box 1;
    fieldInfo.[0,1] <- box XlColumnDataType.xlTextFormat;
    fieldInfo.[1,0] <- box 2;
    fieldInfo.[1,1] <- box XlColumnDataType.xlGeneralFormat;
    let app = new ApplicationClass(Visible=true)
    app.Workbooks.OpenText(@"C:\test.txt", StartRow=1,
        DataType=XlTextParsingType.xlDelimited,
        TextQualifier=XlTextQualifier.xlTextQualifierNone,
        Comma=true, FieldInfo=fieldInfo)
    0

c:\test.txtここで、ファイルにそのようなものを入れるabc,123と、問題なくワークブックに解析されます。

編集: FieldInfoより簡潔な方法で初期化できます。次の配列式の上の 5 つのコード行の代わりに、同じことを行います。

let fieldInfo: obj[] = [|[|1; int XlColumnDataType.xlTextFormat|];
                         [|2; int XlColumnDataType.xlGeneralFormat|]|]

発生した元の実行時例外XlColumnDataTypeは、単なる列挙であるため、配列要素の型とは関係がないため、Excel の場合は整数です。Excel が気に入らないのは、タイプ の F# ジャグ配列をフィードすることですint[][]fieldInfo元のスニペットを強制的に F# で推論int[][]されたものから明示的にタイプするだけで、obj[]この小さな変更で機能します。

于 2012-09-10T22:23:44.107 に答える