EpplusはExcelスプレッドシート列をランダムな負の値に変換します

StackOverflow https://stackoverflow.com/questions/8358966

  •  27-10-2019
  •  | 
  •  

質問

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から手動で変換)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top