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

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

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

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

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

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

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

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

спасибо

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

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

17 ответов


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

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

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

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

Если вы откроете его из Excel, результаты vary:

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

опции включить:

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

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

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

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


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

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


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

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


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

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


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

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

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

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

""text" + NL + "text""

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

2

дата

вот код в Basic

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

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

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


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.

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

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

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

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


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


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


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

$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';

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

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

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


вы можете сделать следующую строку "\ " Value3 Value3 Line2\"". Он работает для меня, генерируя csv-файл в java


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

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

вот интересный подход с использованием 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");                  

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