EPPlus преобразует столбец электронной таблицы Excel в случайное отрицательное значение - PullRequest
1 голос
/ 02 декабря 2011

У меня есть метод C #, см. Код ниже, который генерирует электронную таблицу 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();
        }
    }

Ответы [ 2 ]

3 голосов
/ 02 декабря 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).

2 голосов
/ 03 декабря 2011

Если вы не укажете тип столбца через свойство 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...