我正在使用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。
有没有人见过这个?有没有人知道解决这个问题?
谢谢!
答案 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[]
这个小小的改变将使它发挥作用。