EPPLUS convierte la columna de hoja de cálculo de Excel en un valor negativo aleatorio
Pregunta
Tengo un método C#, ver código a continuación, que genera una hoja de cálculo de Excel usando EPPLU. El método toma en 3 cadenas, una de las cuales es una cadena delimitada de tubería llamada CSV que tiene mis datos. Los datos que estoy usando tienen 14 columnas, y en la columna 14 tengo datos que se ven como: 103.01.06, o 01.01, o algunos otros valores numéricos separados por períodos. El problema que estoy viendo es que si el valor es 103.01.06, EPPLUS transforma eso en el valor -656334. ¿Hay alguna forma de solucionar esto?
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();
}
}
Solución
Si no especifica un tipo de columnas a través de la propiedad de Tipos de datos de la propiedad de la ExcelTextFormat
El objeto luego Epplus asume desconocido para la columna. Dado que tiene catorce columnas y tiene problemas con los datos en la decimocuarta columna, deberá especificar tipos para cada columna anterior. Sin conocer sus tipos de datos, acabo de enumerar catorce instancias de eDataTypes.String
, pero eDataTypes.Number
etc. también funcionaría.
EPPLUS adivina al asignar un tipo a una columna.
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();
}
}
Otros consejos
Parece ser interpretado como DateTime
, tal vez un error.
Prueba esto:
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 = "@";
Si eso no funciona, intente establecer el formato antes de usted LoadFromText
el CSV.
Por ejemplo:
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);
Nota: debe proporcionar un tipo de datos para cada columna. Pero lo he probado con null
, parece funcionar si no desea especificar el tipo. Si no se compila, siéntase libre de cambiar (convertido manualmente de VB.NET).