Генерування файлу CSV для Excel, як мати новий рядок у значенні


158

Мені потрібно генерувати файл для 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
FYI: Це все ідеально працює в LibreOffice, а імпорт CSV-файлів в першу чергу набагато простіше.
user2061057

9
Прийнята відповідь про додаткові пробіли неймовірно збиває з пантелику тепер, коли ви редагували свої питання та видаляли пробіли ...
Matti Virkkunen

Відповіді:


70

Ви повинні мати символи пробілу на початку полів ТОЛЬКО, де символи пробілу є частиною даних. Excel не позбавить провідних просторів. Ви отримаєте небажані пробіли у своїх заголовках та полях даних. Гірше, те, "що повинно бути "захист", що розрив рядків у третьому стовпці буде ігноровано, оскільки він не знаходиться на початку поля.

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

Наступні коментарі стосуються Excel 2003, 2007 та 2013 років; не перевірено на Excel 2000

Якщо ви відкриєте файл, двічі клацнувши його ім'я в Провіднику Windows, все працює добре.

Якщо відкрити його зсередини Excel, результати змінюються:

  1. У вас є лише ASCII символи у файлі (і немає BOM): працює.
  2. У вас у файлі є символи, що не належать до ASCII (закодовані в UTF-8), на початку - BOM UTF-8: він розпізнає, що ваші дані закодовані в UTF-8, але він ігнорує розширення csv і передає вам текст Імпортуйте не Майстра , але, на жаль, ви отримаєте проблему розриву рядків.

Варіанти включають:

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

1
Дякую, я вирішив головну проблему пробілів у питанні, я ввів приклад CSV вручну і не копіював-вставляв із реального файлу, реальний файл не містить цих пробілів.
Нір

@Nir: Тепер поговоримо про вашу справжню проблему. Отже, це означає, що ви мали BOM UTF-8 і відкрили файл зсередини Excel і отримали майстра імпорту тексту, не визнаючи, що ваш новий рядок Value3 має бути "захищеним" - правильно? Або, можливо, у вас не було BOM UTF-8, і вам довелося сказати TIW, що ваші дані закодовані UTF-8 і вони все ще переповнюють новий рядок?
Джон Махін

Що робити, якщо я хочу використовувати | як роздільник полів, новий рядок як роздільник записів, використовуйте "для захисту вмісту текстових полів, а текстові поля можуть містити |", і новий рядок. Чи можливо це?
Джорджіо

1
FYI: Excel2007 та CSV експортуються із системи Redmine. Після додавання UTF-8 BOM (EFBBBF) на початку, Excel прекрасно відкрив файл. Нові рядки, вбудовані в colunm "опис випуску", обробляються правильно, а структура рядків не пошкоджується, а всі національні символи читаються належним чином (вони потрапляли під час читання без UTF8 BOM). Excel навіть не відображає майстра імпорту тексту. Наразі цей CSV тепер має EFBBBFзаголовок, використовується 0Aяк роздільник рядків і 0D0Aяк новий рядок всередині рядків у текстових комірках.
quetzalcoatl

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
Так, це \ r \ n зробив. Я можу підтвердити це за допомогою Windows + Excel, OSX + Numbers та Google Docs.
Йорк Сійслінг

3
Використовуючи \ n (також намагався \ n) у полі, укладеному з ", та використовуючи \ r \ n для розподілу рядків. Все ще не виправили цю проблему для мене в Excel 2010. Я спробував ANSI та UTF8-з-BOM. Немає успіху
nl-x

1
Але це тому, що я використовую | як роздільник поля. Якщо я використовую; як роздільник поля, проблема все ще існує при імпорті даних CSV, але проблема зникає при відкритті CSV, двічі клацнувши на ньому у Провіднику файлів.
nl-x

2
Відповідь Яна не працює для мене в Excel 2003/2010 у Windows 7. Я спробував скористатися шестигранним редактором для редагування файлу BOM UTF-8 та видалив 0D (\ r) з бітів "0D0A" (\ r \ n) для нових рядків у полях. Але це не працює.
Dan 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, але я думаю, що варто спробувати.

Я сподіваюся, що це допомагає ;-)


35
@GusDeCooL Формулювання першого речення ОП "Мені потрібно створити файл для Excel. Деякі значення цього файлу містять кілька рядків". припускає, що, можливо, це не потрібно, щоб це був файл CSV. Крім того, формат запитань застосовується і до інших читачів, і це може бути життєздатним вибором для деяких із них (навіть якщо ОП повинні використовувати CSV). Я вважаю вашу заяву безпідставною (все ж, дякую, що пояснили чому).
dtldarek

1
Насправді це був найкращий варіант для мене; дякую за пропозицію!
Джордан Сірий

8

Варто зазначити, що у файлі .CSV поля, загорнуті у подвійні лапки, які містять розриви рядків, Excel не імпортує файл .CSV належним чином, якщо файл .CSV написаний у форматі UTF-8. Excel трактує розрив лінії так, ніби це CR / LF, і починає новий рядок. Електронна таблиця є накресленою. Це здається правдою, навіть якщо напівколонки використовуються як роздільники поля (замість коми).

Проблему можна вирішити за допомогою блокнота Windows для редагування .CSV-файлу, використовуючи «Файл»> «Зберегти як ...» для збереження файлу та перед збереженням файла, змінивши кодування файлу з UTF-8 на ANSI. Після того як файл буде збережено у форматі ANSI, я виявив, що Microsoft Excel 2013, що працює на Windows 7 Professional, імпортує файл належним чином.


7

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

Це працює для мене і в Excel 2010, і в Excel 2000. Однак, як не дивно, він працює лише тоді, коли ви відкриєте файл як нову електронну таблицю, а не коли ви імпортуєте його в існуючу електронну таблицю за допомогою функції імпорту даних.


так, але тоді я не знайшов можливості зробити кінцеву лінію з крапкою з комою в excel
GusDeCooL

Що робити, якщо деякі фактичні текстові дані містять крапку з двокрапкою? Це не спрацювало б.
htm11h

4

На ПК символ ASCII №10 - це те, що ви хочете розмістити нову лінію у значенні.

Однак, як тільки ви потрапите в Excel, вам потрібно переконатися, що загортання слів увімкнено для багаторядкових комірок, або новий рядок з’явиться у вигляді квадратного поля.


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, які містять BOM, призведуть до того, що Excel буде обробляти нові рядки буквально навіть у тому полі, оточеному цитатами. (Тестований Excel 2008 Mac)

Рішення полягає в тому, щоб зробити будь-які нові лінії поверненням вагона (CHR 13), а не подачею ліній.


Здається, Excel 2016 правильно обробляє мій файл CSV, навіть якщо він містить BOM 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.

у деяких випадках відкриється безпосередньо, інакше потрібно буде використовувати стовпчик для перетворення даних. розширити ширину стовпця та натиснути кнопку обгортання тексту. або відформатувати комірки та активувати обгортання тексту.

і дякую за інші пропозиції, але вони не працювали для мене. Я в чистому вікні env, і не хотів грати з unicode чи іншим смішним.

Таким чином ви додаєте формулу від csv до excel. Для цього методу роботи може бути багато застосувань. (зверніть увагу на = перед цитатами)

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 років МС отримає цю інформацію правильно.)


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");                  

-3

Друк нового рядка HTML <br/>до вмісту та відкриття у програмі excel буде добре працювати на будь-якій програмі excel


-3

Можна використовувати комбінацію клавіш ALT + Enter.

  1. Виберіть клітинку, яку бажаєте редагувати
  2. перейдіть до режиму редагування або подвійним клацанням по ньому або натисканням клавіші F2 3. Натисніть Alt + enter. Це створить новий рядок у комірці

Як ви інтегруєте це в генерацію файлів CVS?
джикуя
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.