2012-09-10 38 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#數組應該具有相同類型的成員。我已將我的代碼編輯爲更簡潔。 –

相關問題