EPPLUS convierte la columna de hoja de cálculo de Excel en un valor negativo aleatorio

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

  •  27-10-2019
  •  | 
  •  

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();
        }
    }
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top