EpplusはExcelスプレッドシート列をランダムな負の値に変換します
質問
epplusを使用してExcelスプレッドシートを生成するコードを参照してください。このメソッドには3つの文字列が含まれています。その1つは、データが入っているCSVという名前のパイプ区切り文字列です。私が使用しているデータには14列があり、14列には103.01.06または01.01、または期間で区切られたその他の数値のようなデータがあります。私が見ている問題は、値が103.01.06の場合、Epplusがそれを値-656334に変換することです。これを修正する方法はありますか?
private void GenerateSpreadsheet(string id, string csv, string worksheetName)
{
using (ExcelPackage pck = new ExcelPackage())
{
ExcelWorksheet ws = pck.Workbook.Worksheets.Add(worksheetName);
ws.Cells["A1"].LoadFromText(csv, new ExcelTextFormat{Delimiter = '|'});
Response.AddHeader("Content-Disposition",
String.Format("attachment; filename={0}.xlsx", id));
Response.ContentType =
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
Response.BinaryWrite(pck.GetAsByteArray());
Response.End();
}
}
解決
datAtypesプロパティを介して列タイプを指定しない場合 ExcelTextFormat
オブジェクトの次に、epplusは列に対して不明を想定します。 14の列があり、14番目の列でデータに問題があるため、前の列ごとにタイプを指定する必要があります。あなたのデータ型を知らなくても、私はちょうど14のインスタンスをリストしました eDataTypes.String
, 、 しかし eDataTypes.Number
なども機能します。
epplusは、列にタイプを割り当てるときに推測します。
private void GenerateSpreadsheet(string id, string csv, string worksheetName)
{
using (ExcelPackage pck = new ExcelPackage())
{
ExcelWorksheet ws = pck.Workbook.Worksheets.Add(worksheetName);
ws.Cells["A1"].LoadFromText(csv, new ExcelTextFormat { Delimiter = '|',
DataTypes = new eDataTypes[] { eDataTypes.String, eDataTypes.String,
eDataTypes.String, eDataTypes.String, eDataTypes.String,
eDataTypes.String, eDataTypes.String, eDataTypes.String,
eDataTypes.String, eDataTypes.String, eDataTypes.String,
eDataTypes.String, eDataTypes.String, eDataTypes.String } });
Response.AddHeader("Content-Disposition",
String.Format("attachment; filename={0}.xlsx", id));
Response.ContentType =
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
Response.BinaryWrite(pck.GetAsByteArray());
Response.End();
}
}
他のヒント
それは解釈されているようです DateTime
, 、多分バグ。
これを試して:
var format = New ExcelTextFormat()
format.Delimiter = '|';
ws.Cells("A1").LoadFromText(csv, format);
var colNumber = 14;
var colRange = ws.Cells(1, colNumber, ws.Dimension.End.Row, colNumber);
colRange.Style.Numberformat.Format = "@";
それが機能しない場合は、あなたの前にフォーマットを設定してみてください LoadFromText
CSV。
例えば:
var csv = IO.File.ReadAllText(csvPath);
var ws = pck.Workbook.Worksheets.Add("Test");
var format As New ExcelTextFormat();
format.Delimiter = '|';
// if columns 4 shall not be interpreted like a DateTime
format.DataTypes = {
null,
null,
null,
eDataTypes.String
};
var range = ws.Cells("A1").LoadFromText(csv, format);
注:すべての列にデータ型を提供する必要があります。しかし、私はそれをテストしました null
, 、タイプを指定したくない場合は機能しているようです。コンパイルされていない場合は、自由に変更してください(VB.NETから手動で変換)。
所属していません StackOverflow