来自F#编译和运行时错误的Excel OpenText()

时间:2012-09-10 21:15:29

标签: f# excel-2010

我正在使用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。

有没有人见过这个?有没有人知道解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

CSV的OpenText()字段信息参数应该是System.Object元素的二维数组,即obj[,],与下面代码段中的fieldInfo值相同({{ 3}}):

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不喜欢的是你给它一个类型为int[][]的F#jugged数组。如果您只是强制 fieldInfo 在原始代码段中输入F#-inferred int[][] 到显式 obj[] 这个小小的改变将使它发挥作用。