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()应该是元素的二维数组System.Object,即obj[,],类似于fieldInfo下面代码段中的值(此处提供 Excel 互操作详细信息):

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# jugged 类型的数组int[][]。如果您只是强制fieldInfo输入从 F#-inferredint[][]到显式的原始片段,obj[]这个小的更改将使其工作。

于 2012-09-10T22:23:44.107 回答