Создание 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:
- у вас есть только символы ASCII в файле( и нет спецификации): работает.
- у вас есть символы, отличные от ASCII (закодированные в UTF-8) в файле, с UTF-8 BOM в начале: он распознает, что ваши данные закодированы в UTF-8, но он игнорирует расширение csv и сбрасывает вас в импорт текста не-A-Wizard, к сожалению, в результате вы получаете проблему разрыва линии.
опции включить:
- обучение пользователей не открывать файлы из Excel :-(
- рассмотрите возможность написания файла 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.
- выберите ячейку, которую вы хотите редактировать
- войдите в режим редактирования, дважды щелкнув его или нажав 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