2016-11-01 24 views
0

私はEPPlusを使用してデータを読み取ります。 このデータは、.xlsxまたは.csvのいずれかで構成されています。EPPlusの解析問題を伴うCSV

ファイルが.csvファイルの場合、私はLoadFromText機能を使用します。 しかし、EPPlusはすべての値を解析する必要があると判断します。ではありません。例えば

:ワークシートの-388

Id;Double; 
1;-3,88; 

ExcelTextFormat format = new ExcelTextFormat(); 
format.Delimiter = ';'; 
worksheet.Cells[1, 1].LoadFromText("file", format); 

結果が-3,88値になるということです。これは私が知ったのは、EPPlusが数字として-3,88を見て、デフォルトのカルチャがInvariantCultureである数値として解析するからです。この場合はus-USに似ています。

EPPlusが構文解析せずにcsvをロードする方法を教えてください。 (すべての値を文字列として取ります)

+0

文化をもっと「ローカル」に設定するだけで済みます。詳細はこちらを参照してください。http://stackoverflow.com/questions/36927002/epplus-converting-csv-and-missing-the-comma-from-a-double/36938148#36938148 – Ernie

+0

次に、私はその文化は必要ですが、コードベースの複数の文化に使用されているので、文字列が必要です。 –

+0

インポートする前に列フォーマットをテキストに設定しようとします。 'worksheet.Cells [" A:A "]。Style.Numberformat.Format =" @ ";' – Magnetron

答えて

1

EPPlusは、インポートされたデータを常にen-US形式で解析しているようです。したがって、最初に10進数値を列としてインポートします。そうすれば、変換の試みはありません。

ExcelTextFormat format = new ExcelTextFormat 
{ 
    Delimiter = ';', 
    DataTypes = new eDataTypes[] { eDataTypes.Number, eDataTypes.String } 
}; 

と値があなたのローカライゼーション、ループの値の正しい小数点区切りでインポートされた後、小数、正しい番号の書式を設定するためにそれらを変換

int columnNumber = 2; 

for (int i = 2; i <= rowCount; i++) 
{ 
    worksheet.Cells[i, columnNumber].Style.Numberformat.Format = "0.00"; 
    worksheet.Cells[i, columnNumber].Value = Convert.ToDecimal(worksheet.Cells[i, columnNumber].Value); 
} 
+0

これは動作します。ドキュメントには、必ずしも2番目の列には番号が付いているとは限りません。ドキュメント全体にeDataTypes.Stringを設定できますか? –

+0

いいえ、 'ExcelTextFormat'を使用する場合は列ごとにする必要がありますが、20のeDataTypes.Stringを追加するだけで、最初の20列はCSVに存在しなくても文字列になります。しかし、正しい列がわからない場合は、すべての列が数値/整数でない限り、変換を実行することも困難です。 – VDWWD

+0

私は以下を使用します:eDataTypes [] dataTypes = Enumerable.Repeat(eDataTypes.String、5000).ToArray();最初の5000列のStringを作成します。それはかなりですが、それは今のために、ありがとう! –