Разрывы строк в сгенерированном CSV-файле сводят меня с ума - PullRequest
8 голосов
/ 10 мая 2011

Я пытаюсь сделать экспорт некоторых данных, которые у меня есть (хранятся в базе данных). Некоторые из этих значений имеют разрыв строки. Теперь каждый раз, когда я пытаюсь импортировать файл в Excel (2010), разрывы строк распознаются как новая строка вместо фактического переноса строки.

Я искал несколько часов, видел много решений, но я просто не могу исправить это.

Способ вывода файла в формате csv: (переменная csvfile является строителем строк)

context.Response.Clear();
context.Response.ContentType = "text/csv";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + name + ".csv");
context.Response.Write(csvfile.ToString());
context.Response.End();

Когда я открываю его с помощью Excel вручную, он отображается нормально. Но поскольку Excel 2003 не поддерживает формат файла, я должен импортировать его. При импорте он видит разрывы строк (\ n в полях) как новую строку.

К сожалению, я не могу дать вам пример реальных данных, с которыми я работаю (это все личные данные), но я могу привести вам пример того, как все идет не так:

Header1,Header2,Header3
"value1","value2","value 3
and this is where its going wrong"

Это простой CSV-файл, и когда вы импортируете его, вы увидите, где он идет не так. По умолчанию я инкапсулирую поля двойными кавычками. Я также удаляю начальные пробелы из значений по умолчанию.

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

Ответы [ 5 ]

3 голосов
/ 10 мая 2011

Это работает для меня:

a) Настройка Response.ContentEncoding = System.Text.Encoding.UTF8 недостаточна, чтобы Excel правильно открывал файлы UTF-8. Вместо этого вы должны вручную написать заголовок метки порядка байтов (BOM) для файла Excel:

if (UseExcel2003Compatibility)
    {
        // write UTF-16 BOM, even though we export as utf-8. Wrong but *I think* the only thing Excel 2003 understands
        response.Write('\uFEFF');
    }
    else
    {
        // use the correct UTF-8 bom. Works in Excel 2008 and should be compatible to all other editors
        // capable of reading UTF-8 files
        byte[] bom = new byte[3];
        bom[0] = 0xEF;
        bom[1] = 0xBB;
        bom[2] = 0xBF;
        response.BinaryWrite(bom);
    }

b) отправить как поток октетов, использовать имя файла с расширением .csv и заключить в кавычки имя файла, как того требует спецификация HTTP:

response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

в) использовать двойные кавычки для всех полей

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

Но учтите, что Excel по-прежнему не будет правильно открывать такие CSV во всех системах, в которых разделитель по умолчанию отличается от ",". Например. если пользователь запускает Excel в системе Windows с немецкими региональными настройками, Excel не откроет файл должным образом, так как он ожидает точку с запятой вместо запятой в качестве разделителя. Я не думаю, что с этим можно что-то сделать.

1 голос
/ 10 мая 2011

Вам разрешается разрыв строки в CSV-файле, если поле содержит двойные кавычки. Кажется, проблема в том, что Excel правильно импортирует записи.

Это было задано ранее на сайте, с несколькими возможными решениями:

  • Установите кодировку в выходном файле на ASCII или UTF-8. Поскольку в вопросе вы устанавливаете UTF-8, попробуйте ASCII. ( ссылка )

  • Измените имя файла на .csv, что может заставить Excel правильно импортировать файл ( ссылка )

1 голос
/ 10 мая 2011

Я не думаю, что вы можете иметь новую строку в поле CSV, поскольку новая строка указывает на новую запись. Можете ли вы заменить все новые строки в значении поля перед добавлением его в строку? Или, может быть, вы можете создать файл Excel, они должны разрешать переводы строк в поле.

0 голосов
/ 30 мая 2012

У меня была такая же проблема.Я пришел к решению, просматривая этот блог в разделе - "Экспорт в Excel с правильным форматированием:"

Я изменил свой код следующим образом:

string brstyle = @"<style>br { mso-data-placement:same-cell; }</style>";

Response.Write(brstyle);

Response.Write(stringWriter.ToString());

Это сработало для меня.Теперь текст с переносами строк отображается в отдельных ячейках, а не в новой ячейке (строке) для каждого переноса строки.

0 голосов
/ 09 декабря 2011

Файлы UTF, содержащие спецификацию, заставят Excel обрабатывать новые строки буквально даже в этом поле, заключенном в кавычки.(Проверено в Excel 2008 Mac)

Решение состоит в том, чтобы сделать любые новые строки переводом каретки (CHR 13), а не переводом строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...