it-swarm.com.ru

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

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

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

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

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

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

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

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

Спасибо

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

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

145
Nir

Вы должны иметь пробелы в начале полей ТОЛЬКО там, где пробелы являются частью данных. 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 и переводит вас в Мастер импорта текста, не являющийся волшебником , к сожалению, в результате возникает проблема с разрывом строки.

Варианты включают в себя:

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

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

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

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

18
dtldarek

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

8
OneSkyWalker

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

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

6
Esben

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

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

4
devuxer

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

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

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

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

""text" + NL + "text""

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

2

ДАТА

Вот код в Basic

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

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

$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';
2
Lisa Simpson

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

1
Ivan Cev

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

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

1
Stephen

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

1
Duncan Wallace

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

0
Sebastian

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

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

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

0
Tam Tran

Только для File Open, синтаксис

 ,"one\n
 two",...

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

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

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

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

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

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

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

0
Tuntable