Создание 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 + введите. Это создаст новую строку в ячейке