2012-09-10 53 views
2

我使用的Microsoft.Office.Interop.Excel在F#自动CSV文件到Excel工作簿对最终用户的开放和转换。Excel中OpenText公司()的F#编译和运行时错误

当使用整数为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。

有没有其他人见过?有没有人知道解决这个问题的方法?

谢谢!

用于CSV的 OpenText()
+0

我已经编辑我原来的答复,以解决您的与现场信息参数的具体问题。请享用! –

+0

你可能会发布一些代码?也许你可能会分享确切的错误信息 - 准确的“关于使用整数的运行时投诉”?也就是说,假设@GeneBelitski还没有回答你的问题。 –

+0

谢谢,对于缺少代码和错误消息感到抱歉。我已经添加了两个。 –

回答

2

字段信息参数应该是System.Object元件,即obj[,]的二维阵列,如在下面的代码段fieldInfo值(Excel interop details are available here):

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.txtabc,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[]这个小变化将使其工作。

+0

这样做!非常感谢。我不仅必须装箱,而且还必须使用可变数组而不是数组表达式。我不明白为什么我必须这样做;但至少我的代码现在工作。非常感谢! –

+0

@JeffManer:你是非常欢迎(C:其实,因为这是VB样的互操作同样可以用整数数组表达和编译器来实现会为你做 拳击但是你应该投'XlColumnDataType'为'int类型。 '因为F#数组应该具有相同类型的成员。我已将我的代码编辑为更简洁。 –