Создание CSV файла для Excel, как иметь новую строку внутри значения

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

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

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

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

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

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

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

Спасибо

EDIT: "Я решил" свою проблему, имея две опции CSV: одну для Excel (Unicode, вкладку разделенную, без новой строки в полях) и одну для остальной части мира (UTF8, стандартный CSV).

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

Ответ 1

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

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

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

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

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

  • У вас есть только символы ASCII в файле (и без спецификации): работает.
  • В файле есть символы, отличные от ASCII (кодированные в UTF-8), с указанием спецификации UTF-8 в начале: он распознает, что ваши данные закодированы в UTF-8, но он игнорирует расширение csv и отбрасывает вас в "Импорт не импортированного текста", к сожалению, в результате вы получите проблему с разрывом строки.

Параметры включают:

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

Ответ 2

После многих настроек, здесь есть конфигурация, которая работает для генерации файлов в 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);

Ответ 3

Недавно у меня была схожая проблема, я решил ее, импортировав файл 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, но я думаю, что стоит попробовать.

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

Ответ 4

Стоит отметить, что когда файл .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, будет импортировать файл должным образом.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

""text" + NL + "text""

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

2

DATE

Здесь код в Basic

CHR$(34,"2", 10,"DATE", 34)

Ответ 8

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

$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

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

echo 'Click <a href="myfile.csv">here</a> to download file';

Ответ 9

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

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

Ответ 10

Проверьте это: Это полностью работает для меня: Поместите следующие строки в файл 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.

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

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

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

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

Ответ 11

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

Ответ 12

Способ, которым мы это делаем (мы используем VB.Net), заключается в том, чтобы заключить текст с новыми строками в Chr (34), который является char, представляющим двойные кавычки, и заменяет все символы CR-LF для LF.

Ответ 13

Обычно новая строка "\ r\n". В моем CSV я заменил "\ r" пустым значением. Вот код в Javascript:

cellValue = cellValue.replace(/\r/g, "")

Когда я открываю CSV в MS Excel, он работает хорошо. Если значение имеет несколько строк, оно останется в пределах одной отдельной ячейки в листе Excel.

Ответ 14

Только для открытия файла, синтаксис

 ,"one\n
 two",...

Важно то, что нет пробела после первого ",". Обычно пробелы в порядке, и обрезаются, если строка не в кавычках. Но в остальном противно. Мне понадобилось время, чтобы понять это.

Кажется, не имеет значения, заканчивается ли строка \n или\c\n.

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

Теперь, конечно, File Open не будет должным образом поддерживать UTF-8 (если не использовать трюки).

Excel> Данные> Получить внешние данные > из текста

Может быть установлен в режим UTF-8 (это далеко вниз список шрифтов). Однако в этом случае новые строки не работают, и я не знаю, как это исправить.

(Можно предположить, что через 30 лет М.С. все исправит.)

Ответ 15

В Excel 365 при импорте файла:

Данные → Из текста /CSV → Выбрать файл> Преобразовать данные → Конфигурация источника данных → Выбрать источник данных → Нажмите Изменить источник → В раскрывающемся списке разрыв строки выберите Игнорировать разрывы строк внутри кавычек.

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

Ответ 16

Вы можете сделать следующее "\"Value3 Line1 Value3 Line2\"". У меня работает генерация CSV файла в Java

Ответ 17

Вот интересный подход с использованием JavaScript...

  String.prototype.csv = String.prototype.split.partial(/,\s*/);  

  var results = ("Mugan, Jin, Fuu").csv();                        

  console.log(results[0]=="Mugan" &&                                   
         results[1]=="Jin" &&                                     
         results[2]=="Fuu",                                       
         "The text values were split properly");                  

Ответ 18

Печать HTML-новой строки <br/> в содержимое и открытие в excel будет отлично работать на любом excel

Ответ 19

Вы можете использовать сочетание клавиш ALT + Enter.

  • Выберите ячейку, которую вы хотите отредактировать
  • войдите в режим редактирования, дважды щелкнув по нему или нажав F2 3. Нажмите Alt + введите. Это создаст новую строку в ячейке