EPPlus преобразует столбец электронной таблицы Excel в случайное отрицательное значение

У меня есть метод С#, см. код ниже, который создает электронную таблицу Excel с использованием EPPlus. Метод принимает 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();
        }
    }

person Russ Clark    schedule 02.12.2011    source источник


Ответы (2)


Если вы не укажете тип столбца через свойство Datatypes объекта ExcelTextFormat, тогда EPPlus предполагает, что столбец неизвестен. Поскольку у вас есть четырнадцать столбцов и у вас возникли проблемы с данными в четырнадцатом столбце, вам нужно указать типы для каждого предыдущего столбца. Не зная ваших типов данных, я только что перечислил четырнадцать экземпляров 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();
    }
}
person ahsteele    schedule 03.12.2011

Кажется, это интерпретируется как 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).

person Tim Schmelter    schedule 02.12.2011
comment
Тим, спасибо за пост! Пробовал, не помогло, проблема та же. Есть ли другие значения формата, о которых вы знаете, которые я мог бы попробовать вместо @ ? - person Russ Clark; 02.12.2011
comment
Сейчас я не знаю других стилей, вы можете попробовать установить значения этого столбца в values.ToString, так как все строки вообще не форматируются. - person Tim Schmelter; 02.12.2011