2017-03-15 139 views
1

私はInterop.Excel(v15)を活用して顧客データのワークブックを開き、解析して情報を出力するC#アプリケーションを用意しました。私が持っている問題は、ワークブックセルのいくつかが#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

私はワークシートの行を横断するには、以下の機能を使用する場合、私は-2146826246ののInt値私は#1 N/Aに遭遇するたびに取得します個々のセルは個別に実行されていましたが、アプリケーションが使用できなくなった場所(ほとんどのワークブックには10,000行×38列)のアプリケーションが遅くなりました。私はText、Value、& Value2に変換しようとしたが役に立たなかった。私は比較を実行し、後で値を別のワークブックに出力できるように、実際のフォームで#N/Aの値を読むことができる必要があります。これを達成する最良の方法は何ですか?

+0

文字列に変換する代わりに、@ verabtimをリテラルとして使用するために使用します。 –

+0

@SivaprasathV @ verbatimはどこで使用できますか?値はCOM行オブジェクトから来ています。この形式であっても、-214682646の値は – slashNburn

答えて

0

リンクがあります。

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

私はわかりませんが、-2146826246が#N /値のコードがあるのでちょうど私の提案は、ある、あなたが同じのため、セル値/テキストを確認することができますし、#N/Aを追加することができますあなたのリスト "lst"のテキストとして。

しかし、より良い方法は、OpenXmlを使用してExcelからデータを取得することです。

+1

です。最初の調査/トラブルシューティング段階でマイクの記事を実際に見つけました。記事は10年以上経過しており、この問題に対するより洗練されたソリューションが過去10年間で実現することを期待していました(つまり、手動で#N/Aを翻訳する必要はありません)。私はOpenXmlを使って調べます。 – slashNburn

関連する問題