2017-03-15 49 views
1

我有一個C#應用程序,它利用Interop.Excel(v15)打開一些客戶數據的工作簿,通過​​它們解析並輸出一些信息。我遇到的問題是某些工作簿單元格的值爲#N/A;在Excel中講的是CVErr,指示存在某種類型的錯誤。在我們客戶數據的背景下,他們使用#N/A來表示不適用 - 沒有基本的公式問題,這只是他們使用的價值。C#Interop.Excel'#N/A'單元格值轉換爲-2146826246

private void traverseRows(Excel._Worksheet worksheet) 
{ 
    //Get the used Range 
    Excel.Range usedRange = worksheet.UsedRange; 

    //Last Row/Column 
    int lastUsedRow = usedRange.Row + usedRange.Rows.Count - 1; 
    int lastUsedColumn = usedRange.Column + usedRange.Rows.Columns.Count; 

    foreach (Excel.Range row in usedRange.Rows) 
    { 
     List<String> rowData = rangeToList(row); 
    } 
} 

List<string> rangeToList(Microsoft.Office.Interop.Excel.Range inputRng) 
{ 
    object[,] cellValues = (object[,])inputRng.Value2; 
    List<string> lst = cellValues.Cast<object>().ToList().ConvertAll(x => Convert.ToString(x)); 
    return lst; 
} 

Visual Studio Debug

我試圖檢查:

當我使用下面的函數來遍歷工作表行,每次我遇到一個#N/A時得到的-2146826246 int值每個單元格都是獨立的,但是會將應用程序放慢到無法使用的地步(大多數工作簿有10,000行X 38列)。我試圖轉換爲文本,值,& Value2無濟於事。我需要能夠以真正的形式讀入#N/A值,以便我可以運行比較並稍後將值輸出到其他工作簿。達到此目的的最佳方式是什麼?

+0

而不是轉換爲字符串使用@ verabtim獲取它作爲一個文字。 –

+0

@SivaprasathV我可以在哪裏使用@ verbatim?這些值來自COM Row Object,即使在這種形式下它們的值爲-214682646值 – slashNburn

回答

0

可能下面的鏈接會幫助你。

https://xldennis.wordpress.com/2006/11/29/dealing-with-cverr-values-in-net-part-ii-solutions/

我不知道,但只是我的建議是,作爲-2146826246是#N/A值的代碼,你可以檢查單元格的值/文本相同,你可以添加#N/A作爲列表中的文本「lst」。

但更好的方法是使用OpenXml從Excel中檢索數據。

+1

在我的初始研究/故障排除階段,我實際上遇到了Mike的文章;這篇文章已有10多年的歷史,我希望在過去的十年中,這個問題能夠得到更加優雅的解決方案(即不需要手動翻譯所有#N/A)。我會研究使用OpenXml。 – slashNburn

相關問題