Создание файла CSV для Excel, как получить новую строку внутри значения - PullRequest
145 голосов
/ 07 августа 2009

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

там также есть текст не на английском языке, поэтому файл должен быть Unicode.

Файл, который я генерирую, теперь выглядит следующим образом: (в UTF8, с неанглийским текстом и большим количеством строк)

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"

Обратите внимание, что многострочное значение заключено в двойные кавычки с обычным ежедневным переводом строки.

Согласно тому, что я обнаружил в Интернете, это должно работать, но это не так, по крайней мере, не в файлах Excel 2007 и UTF8, Excel обрабатывает 3-ю строку как вторую строку данных, а не как вторую строку первая строка данных.

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

Спасибо

РЕДАКТИРОВАТЬ: я «решил» мою проблему, имея два варианта CSV, один для Excel (Unicode, табуляция разделена, без новых строк в полях) и один для остального мира (UTF8, стандартный CSV).

Не то, что я искал, но, по крайней мере, это работает (пока)

Ответы [ 18 ]

65 голосов
/ 09 августа 2009

Вы должны иметь пробелы в начале полей ТОЛЬКО там, где пробелы являются частью данных. Excel не будет убирать пробелы. Вы получите ненужные места в заголовках и полях данных. Хуже того, ", который должен «защищать» разрыв строки в третьем столбце, будет игнорироваться, поскольку он не находится в начале поля.

Если в файле есть символы, не входящие в ASCII (кодированные в UTF-8), в начале файла должна быть спецификация UTF-8 (3 байта, hex EF BB BF). В противном случае Excel будет интерпретировать данные в соответствии с кодировкой по умолчанию для вашей локали (например, cp1252) вместо utf-8, и ваши символы, отличные от ASCII, будут уничтожены.

Следующие комментарии относятся к Excel 2003, 2007 и 2013; не тестировался в Excel 2000

Если открыть файл, дважды щелкнув его имя в проводнике Windows, все будет в порядке.

Если вы откроете его из Excel, результаты будут разными:

  1. У вас есть только символы ASCII в файле (и нет спецификации): работает.
  2. В файле содержатся не-ASCII-символы (закодированные в UTF-8), а в начале - спецификация UTF-8: он распознает, что ваши данные закодированы в UTF-8, но игнорирует расширение csv и сбрасывает вас в Text Import not-a-Wizard , к сожалению, в результате возникла проблема с разрывом строки.

Опции включают в себя:

  1. Обучите пользователей не открывать файлы из Excel: - (
  2. Рассмотрите возможность записи файла XLS напрямую ... для этого есть пакеты / библиотеки в Python / Perl / PHP / .NET / etc
23 голосов
/ 01 марта 2012

После многих настроек, вот конфигурация, которая работает для генерации файлов в Linux, чтение в Windows + Excel

  • Новые строки в поле должны быть \ n (и, очевидно, заключены в двойные кавычки)
  • Конец записи: \ r \ n
  • Убедитесь, что вы не начинаете поле с равенства, иначе оно обрабатывается как формула и усекается

В Perl я использовал Text :: CSV, чтобы сделать это следующим образом:

use Text::CSV;

open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!";
my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" });

#for each row...:
$csv -> print ($FO, \@row);
18 голосов
/ 07 июня 2013

Недавно у меня была похожая проблема, я решил ее, импортировав файл HTML , базовый пример будет выглядеть так:

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
  <head>
    <style>
      <!--
      br {mso-data-placement:same-cell;}
      -->
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td>first line<br/>second line</td>
        <td style="white-space:normal">first line<br/>second line</td>
      </tr>
    </table>
  </body>
</html>

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

Надеюсь, это поможет; -)

8 голосов
/ 29 апреля 2015

Стоит отметить, что если в файле .CSV имеются поля, заключенные в двойные кавычки, содержащие разрывы строк, Excel не будет правильно импортировать файл .CSV, если файл .CSV записан в формате UTF-8. Excel обрабатывает разрыв строки, как если бы это был CR / LF, и начинает новую строку. Электронная таблица искажена. Это кажется верным, даже если точки с запятой используются в качестве разделителей полей (вместо запятых).

Проблема может быть решена с помощью Windows Notepad для редактирования файла .CSV, с помощью File> Save As ... для сохранения файла и перед сохранением файла, изменив кодировку файла с UTF-8 на ANSI. После сохранения файла в формате ANSI я обнаружил, что Microsoft Excel 2013, работающий в Windows 7 Professional, правильно импортирует файл.

6 голосов
/ 22 сентября 2011

Новая строка внутри значения, кажется, работает, если вы используете точку с запятой в качестве разделителя вместо запятой или табуляции и используете кавычки.

Это работает для меня как в Excel 2010, так и в Excel 2000. Однако, что удивительно, оно работает только при открытии файла как новой электронной таблицы, а не при его импорте в существующую электронную таблицу с использованием функции импорта данных.

4 голосов
/ 07 августа 2009

На ПК, символ ASCII # 10 - это то, что вы хотите поместить новую строку в значение.

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

3 голосов
/ 16 сентября 2013

Это не будет работать, если вы попытаетесь импортировать файл в EXCEL.

Свяжите расширение файла csv с EXCEL.EXE, чтобы вы могли вызывать EXCEL, дважды щелкнув файл csv.

Здесь я помещаю некоторый текст, за которым следует символ NewLine, за которым следует еще один текст И заключая всю строку в двойные кавычки.

Не используйте CR, поскольку EXCEL поместит часть строки в следующую ячейку.

""text" + NL + "text""

Когда вы вызовете EXCEL, вы увидите это. Возможно, вам придется автоматически определить высоту, чтобы увидеть все это. Где разрывы строк будут зависеть от ширины ячейки.

2

ДАТА

Вот код в Basic

CHR$(34,"2", 10,"DATE", 34)
2 голосов
/ 23 июля 2011

Я нашел это, и это сработало для меня

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

Тогда, куда вам нужно приложить материал

$myfile = ('/path/to/myfile.csv');
//erase any previous contents
$fp = fopen($myfile, 'w+');
fwrite($fp, $enc1 .  'Column Heading 1' . $enc1 . $delimiter );
//append to new file
$fp2 = fopen($myfile, 'a');
fwrite($fp2, $enc1 .  'Column Heading 2' . $enc1 . $delimiter );

.....

fwrite($fp2, $enc1 .  'Last Column Heading' . $enc1 . $delimiter. PHP_EOL );

Тогда, когда вам нужно что-то записать - например, HTML, который включает «вы можете сделать это

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

Новые строки заканчиваются на . PHP_EOL

В конце скрипта выводится ссылка, чтобы пользователь мог загрузить файл.

echo 'Click <a href="myfile.csv">here</a> to download file';
1 голос
/ 04 февраля 2017

Помещение «\ r» в конце каждой строки фактически приводило к разрывам строк в Excel, но в .csv оно исчезало и оставляло безобразный беспорядок, где каждая строка была сдвинута против следующей без пробела и без строки. -breaks

1 голос
/ 28 января 2016

Проверьте это: Это полностью работает для меня: Поместите следующие строки в xxxx.csv файл

hola_x,="este es mi text1"&CHAR(10)&"I sigo escribiendo",hola_a

hola_y,="este es mi text2"&CHAR(10)&"I sigo escribiendo",hola_b

hola_z,="este es mi text3"&CHAR(10)&"I sigo escribiendo",hola_c

Открыть в Excel.

в некоторых случаях откроется напрямую, в противном случае потребуется использовать преобразование столбца в данные. увеличьте ширину столбца и нажмите кнопку переноса текста. или отформатируйте ячейки и активируйте текст переноса.

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

Таким образом, вы помещаете формулу из CSV в Excel. Может быть много применений для этого метода работы. (обратите внимание на = перед кавычками)

pd: В ваших предложениях, пожалуйста, приведите несколько примеров данных, а не только код.

...