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

158

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

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

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

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

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

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

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

Спасибо

РЕДАКТИРОВАТЬ: я "решил" мою проблему, имея два варианта CSV, один для Excel (Unicode, табуляция разделена, без новых строк в полях) и один для остального мира (UTF8, стандартный CSV).

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

Nir
источник
1
К вашему сведению: все это прекрасно работает в LibreOffice, и в первую очередь импортировать CSV намного проще.
user2061057 30.12.16
9
Принятый ответ о лишних пробелах невероятно запутывает теперь, когда вы отредактировали свои вопросы и удалили пробелы ...
Матти Вирккунен,

Ответы:

70

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

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

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

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

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

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

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

  1. Обучите пользователей не открывать файлы из Excel :-(
  2. Попробуйте написать файл XLS напрямую ... для этого есть пакеты / библиотеки в Python / Perl / PHP / .NET / etc
Джон Мачин
источник
1
Спасибо, я исправил проблему с начальными пробелами в вопросе, я набрал CSV-пример вручную и не копировал-вставлял из реального файла, реальный файл не включает эти пробелы, хороший улов.
Nir
@Nir: Теперь давайте поговорим о вашей реальной проблеме. Так что это означает, что у вас была спецификация UTF-8, и вы открыли файл из Excel и получили Мастер импорта текста, не распознающий, что символ новой строки Value3 должен быть «защищен» - правильно? Или, может быть, у вас не было спецификации UTF-8, и вы должны были сообщить TIW, что ваши данные были закодированы в UTF-8, и это все еще мешало переводу строки?
Джон Мачин
Что делать, если я хочу использовать | в качестве разделителя полей используйте новую строку в качестве разделителя записей, используйте «для защиты содержимого текстовых полей, а текстовые поля могут содержать |,» и новую строку. Это возможно?
Джорджио
1
К вашему сведению: я экспортировал Excel2007 и CSV из системы Redmine. После добавления спецификации UTF-8 (EFBBBF) в начале Excel отлично открыл файл. Новые строки, встроенные в столбец «описание проблемы», обрабатываются правильно, структура строк не повреждена, и все национальные символы читаются правильно (они были выброшены при чтении без спецификации UTF8). Excel даже не отображал мастер импорта текста. В настоящее время этот CSV теперь имеет EFBBBFзаголовок, используется 0Aкак разделитель строк и 0D0Aкак новая строка внутри строк в текстовых ячейках.
Кетцалькоатль
1
Если вы пытаетесь заставить Excel для OS X правильно читать CSV, а также Excel для Windows, вот отличный ресурс: stackoverflow.com/questions/4348802/…
Александр Р. Джанини
25

После многих настроек, вот конфигурация, которая работает для генерации файлов в 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
Да, это сделал это. Я могу подтвердить, что это работает с Windows + Excel, OSX + Numbers и Google Docs.
Йорик Сийслинг
3
Использование \ n (также попыталось \ n) в поле, заключенном в ", и использование \ r \ n для разделения строк. В Excel 2010 эта проблема для меня не решена. Я пробовал ANSI и UTF8-with-BOM. Безуспешно
nl-x
1
Но это потому, что я использую | в качестве разделителя полей. Если я использую; как разделитель полей, проблема все еще существует при импорте данных CSV, но проблема исчезает при открытии CSV, если дважды щелкнуть его в проводнике.
NL-X
2
Ответ Яна не работает для меня в Excel 2003/2010 в Windows 7. Я попытался с помощью шестнадцатеричного редактора отредактировать свой файл спецификации UTF-8 и удалил 0D (\ r) из битов '0D0A' (\ r \ n) для новых строк в полях. Но это не работает.
Дан W
Этот ответ работал для меня (с нулевыми изменениями!), Используя Excel 2010 и Windows 7; также использующий Perl v5.14.2, который поставляется с Cygwin. Мои встроенные переводы были все \n. Спасибо
ardnew
21

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

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

dtldarek
источник
35
@GusDeCooL Формулировка первого предложения ОП: «Мне нужно создать файл для Excel, некоторые значения в этом файле содержат несколько строк». предполагает, что, возможно, это не должен быть файл CSV. Кроме того, формат вопросов и ответов применим и к другим читателям, и для некоторых из них он может быть жизнеспособным выбором (даже если ОП должен был использовать CSV). Я считаю ваше отрицательное мнение необоснованным (тем не менее, спасибо за объяснение почему).
dtldarek
1
На самом деле это был лучший вариант для меня; спасибо за предложение!
Джордан Грей
8

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

OneSkyWalker
источник
7

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

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

Esben
источник
да, но тогда я не нашел возможности завершить строку точкой с запятой в Excel
GusDeCooL
Что если некоторые из фактических текстовых данных содержат точку с запятой? Это не будет работать.
htm11h
4

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

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

devuxer
источник
3

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

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

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

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

""text" + NL + "text""

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

2

ДАТА

Вот код в Basic

CHR$(34,"2", 10,"DATE", 34)
Пибоди
источник
2

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

$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';
Лиза Симпсон
источник
1

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

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

Стивен
источник
Excel 2016, похоже, правильно обрабатывает мой CSV-файл, даже если он имеет спецификацию UTF8. Тем не менее, все, что имело значение, это использование ';' в качестве разделителя полей (это то, что Excel делает для всех языков, которые имеют ',' в качестве десятичного разделителя).
Але
1

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

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

Иван Цев
источник
1

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

Дункан Уоллес
источник
0

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

Себастьян
источник
0

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

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

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

Там Тран
источник
0

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

 ,"one\n
 two",...

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

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

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

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

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

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

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

Tuntable
источник
0

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

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

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

Клодоальдо Нето
источник
-1

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

Фреди Чика
источник
-2

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

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

Шаши
источник
-3

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

  1. Выберите ячейку, которую вы хотите редактировать
  2. Войдите в режим редактирования, дважды щелкнув по нему или нажав F2. 3. Нажмите Alt + enter. Это создаст новую строку в ячейке
Мегана Чамарти
источник
Как вы интегрируете это в генерацию файла CVS?
jikuja