EPPlus将Excel Spreadsheet列转换为随机负值

我有一个C#方法,请参阅下面的代码,它使用EPPlus生成Excel电子表格。 该方法接受3个字符串,其中一个是名为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(); } } 

如果未通过ExcelTextFormat对象的Datatypes属性指定列类型,则EPPlus将假定该列未知。 由于您有十四列,并且您在第十四列中遇到数据问题,因此您需要为每个前一列指定类型。 在不知道您的数据类型的情况下,我刚刚列出了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 ,也许是一个bug。

试试这个:

 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); 

注意:您必须为每列提供DataType。 但我已经用null测试了它,如果你不想指定类型似乎工作。 如果它没有编译,请随意更改(从VB.NET手动转换)。