EPPlus: CSV в Excel - все результаты в одной строке - PullRequest
1 голос
/ 28 мая 2020

У меня возникла странная проблема при экспорте файла Excel на Linux с использованием EPPlus версии 4.5.3.3.

Проблема в том, что при создании содержимого CSV и его использовании content для создания файла excel, весь результат попадает в первую строку таблицы excel (с использованием Libre-Office в Ubuntu). Это происходит только на Linux (протестировано Ubuntu и Debian), но не на Windows. Еще одна странность заключается в том, что когда я использую не CSV-контент для создания файла excel, а коллекцию, он работает без проблем. К сожалению, в этом случае нет возможности использовать настраиваемые заголовки.

Код для создания CSV:

private static string GenerateCsv()
{
    var header = $"{nameof(Menu.Main)}{Delimiter}{nameof(Menu.Desert)}";
    var builder = new StringBuilder();
    builder.AppendLine(header);

    foreach (var menu in Menus)
    {
        var row = $"{menu.Main}{Delimiter}{menu.Desert}";
        builder.AppendLine(row);
    }

    return builder.ToString();
}

Код для создания файла Excel:

var csv = GenerateCsv();

using var pck = new ExcelPackage();

var ws = pck.Workbook.Worksheets.Add("Sheet1");

var format = new ExcelTextFormat
{
    DataTypes = new[]
    {
        eDataTypes.String, eDataTypes.String
    },
    Delimiter = Delimiter.First(),
    Encoding = new UTF8Encoding(),
};

using var range = ws.Cells[1, 1];

range.LoadFromText(csv, format);

var bytes = pck.GetAsByteArray();

return this.File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "menus.xlsx", true);

Полный образец можно клонировать из этого github-репозитория . Если вы запускаете его на windows, вы увидите, что он работает нормально.

Я действительно много чего пробовал, а также попытался изменить разделитель с ; на ,, ввел квалификатор текста и что нет, но, похоже, не могу сделать это работает.

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 16 июня 2020

Метод StringBuilder.AppendLine в CreateCsv завершает каждую строку
указателем конца строки по умолчанию включенной ОС:

  • Windows \r\n
  • Unix \n

EPPlus не соблюдает терминатор строки по умолчанию ОС и использует \r\n в качестве значения по умолчанию.
Вот почему он работает с Windows.

Таким образом, вы можете установить для свойства ExcelTextFormat.EOL значение Environment.NewLine, чтобы использовать терминатор строки по умолчанию ОС.

var format = new ExcelTextFormat
{
    DataTypes = new[]
    {
        eDataTypes.String, eDataTypes.String
    },
    Delimiter = Delimiter.First(),
    Encoding = new UTF8Encoding(),
    EOL = Environment.NewLine
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...