Generowanie pliku CSV dla programu Excel, jak umieścić znak nowej linii w wartości


158

Muszę wygenerować plik dla programu Excel, niektóre wartości w tym pliku zawierają wiele wierszy.

jest tam również tekst w języku innym niż angielski, więc plik musi być w formacie Unicode.

Plik, który teraz generuję, wygląda następująco: (w UTF8, z domieszanym tekstem innym niż angielski i wieloma wierszami)

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

Zauważ, że wartość wielowierszowa jest ujęta w podwójne cudzysłowy, z normalnym codziennym znakiem nowej linii.

Zgodnie z tym, co znalazłem w sieci, powinno to działać, ale nie działa, przynajmniej nie wygrywa plików Excel 2007 i UTF8, Excel traktuje trzecią linię jako drugi wiersz danych, a nie jako drugą linię pierwszego wiersza danych .

Musi to działać na komputerach mojego klienta i nie mam kontroli nad ich wersją programu Excel, więc potrzebuję rozwiązania, które będzie działać z programem Excel 2000 i nowszym.

Dzięki

EDYCJA: „rozwiązałem” mój problem, mając dwie opcje CSV, jedną dla programu Excel (Unicode, rozdzielone tabulatorami, bez znaków nowej linii w polach) i jedną dla reszty świata (UTF8, standardowy CSV).

Nie to, czego szukałem, ale przynajmniej działa (na razie)


1
FYI: To wszystko działa doskonale w LibreOffice, a importowanie pliku CSV jest przede wszystkim znacznie łatwiejsze.
user2061057

9
Zaakceptowana odpowiedź na temat dodatkowych spacji jest niesamowicie zagmatwana, teraz, gdy zredagowałeś swoje pytania i usunąłeś spacje ...
Matti Virkkunen

Odpowiedzi:


70

Powinieneś mieć znaki spacji TYLKO na początku pól tam, gdzie znaki spacji są częścią danych. Excel nie usunie wiodących spacji. Otrzymasz niechciane spacje w nagłówkach i polach danych. Co gorsza, to, "co powinno „chronić” ten znak końca wiersza w trzeciej kolumnie, zostanie zignorowane, ponieważ nie znajduje się na początku pola.

Jeśli masz w pliku znaki inne niż ASCII (zakodowane w UTF-8), powinieneś mieć BOM UTF-8 (3 bajty hex EF BB BF) na początku pliku. W przeciwnym razie Excel zinterpretuje dane zgodnie z domyślnym kodowaniem ustawień regionalnych (np. Cp1252) zamiast utf-8, a znaki spoza zestawu ASCII zostaną usunięte.

Poniższe uwagi dotyczą programu Excel 2003, 2007 i 2013; nie testowano w programie Excel 2000

Jeśli otworzysz plik, klikając dwukrotnie jego nazwę w Eksploratorze Windows, wszystko działa OK.

Jeśli otworzysz go z poziomu programu Excel, wyniki będą się różnić:

  1. Masz tylko znaki ASCII w pliku (bez BOM): działa.
  2. Masz znaki spoza ASCII (zakodowane w UTF-8) w pliku, z BOM UTF-8 na początku: rozpoznaje, że twoje dane są zakodowane w UTF-8, ale ignoruje rozszerzenie csv i przenosi cię do tekstu Importuj nie-kreatora , niestety w wyniku pojawia się problem z podziałem wiersza.

Dostępne opcje:

  1. Poinstruuj użytkowników, aby nie otwierali plików w programie Excel :-(
  2. Rozważ napisanie pliku XLS bezpośrednio ... dostępne są pakiety / biblioteki do zrobienia tego w Python / Perl / PHP / .NET / etc

1
Dzięki, naprawiłem główny problem ze spacjami w pytaniu, wpisałem przykład CSV ręcznie i nie skopiowałem i wklejono z prawdziwego pliku, prawdziwy plik nie zawiera tych spacji, dobry chwyt.
Nir

@Nir: Porozmawiajmy teraz o Twoim prawdziwym problemie. Oznacza to, że masz BOM UTF-8 i otworzyłeś plik w programie Excel, a Kreator importu tekstu nie rozpoznał, że nowa linia Value3 powinna być „chroniona” - prawda? A może nie miałeś BOM-u UTF-8 i musiałeś powiedzieć TIW, że Twoje dane zostały zakodowane w UTF-8 i nadal spartaczył nowy wiersz?
John Machin,

A jeśli chcę użyć | jako separator pól, nowy wiersz jako separator rekordów, użyj „do ochrony zawartości pól tekstowych, a pola tekstowe mogą zawierać |,” i nowy wiersz. czy to możliwe?
Giorgio

1
FYI: Mam Excel2007 i CSV wyeksportowane z systemu Redmine. Po dodaniu BOM UTF-8 (EFBBBF) na początku, Excel idealnie otworzył plik. Nowe wiersze osadzone w kolumnie „opis problemu” są przetwarzane poprawnie, struktura wierszy nie jest uszkodzona, a wszystkie znaki narodowe są poprawnie odczytywane (zostały usunięte podczas odczytu bez BOM UTF8). Program Excel nawet nie wyświetlił kreatora importu tekstu. Obecnie ten plik CSV ma teraz EFBBBFnagłówek, służy 0Ajako separator wierszy i 0D0Ajako nowa linia wewnątrz ciągów w komórkach tekstowych.
quetzalcoatl

1
Jeśli próbujesz uzyskać program Excel dla OS X, aby poprawnie odczytywał plik CSV, a także Excel dla systemu Windows, oto świetne źródło: stackoverflow.com/questions/4348802/ ...
Alexandre R. Janini

25

Po wielu poprawkach, oto konfiguracja, która działa generując pliki w systemie Linux, czytając w systemie Windows + Excel, chociaż osadzony format nowej linii nie jest zgodny ze standardem :

  • Nowe wiersze w polu muszą być \ n (i oczywiście cytowane w cudzysłowach)
  • Koniec zapisu: \ r \ n
  • Upewnij się, że nie zaczynasz pola od równości, w przeciwnym razie zostanie potraktowane jako formuła i obcięte

W Perlu użyłem Text :: CSV, aby zrobić to w następujący sposób:

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
Tak, \ r \ n to zrobiłem. Mogę potwierdzić, że działa to z Windows + Excel, OSX + Numbers i Google Docs.
Yorick Sijsling

3
Używanie \ n (również próbowałem \ n) w polu otoczonym znakiem "i używanie \ r \ n do dzielenia wierszy. Nadal nie rozwiązałem tego problemu w programie Excel 2010. Próbowałem ANSI i UTF8-with-BOM. Brak sukcesu
nl-x

1
Ale to dlatego, że używam | jako separator pól. Jeśli używam; jako separator pól problem nadal występuje podczas importowania danych CSV, ale problem znika podczas otwierania pliku CSV przez dwukrotne kliknięcie w Eksploratorze plików.
nl-x

2
Odpowiedź Iana nie działa dla mnie w programie Excel 2003/2010 w systemie Windows 7. Próbowałem edytować plik BOM UTF-8 za pomocą edytora szesnastkowego i usunąłem 0D (\ r) z bitów „0D0A” (\ r \ n) dla nowych linii w polach. Ale to nie działa.
Dan W

Ta odpowiedź zadziałała dla mnie (bez modyfikacji!) Przy użyciu programu Excel 2010 i Windows 7; również używając perl v5.14.2, który jest dostarczany z cygwin. Wszystkie moje osadzone nowe linie \n. Dzięki
ardnew

21

Ostatnio miałem podobny problem, rozwiązałem go importując plik HTML , przykład bazowy wyglądałby tak:

<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>

Wiem, że to nie jest plik CSV i może działać inaczej dla różnych wersji programu Excel, ale myślę, że warto spróbować.

Mam nadzieję, że to pomoże ;-)


35
@GusDeCooL Sformułowanie pierwszego zdania OP „Muszę wygenerować plik dla programu Excel, niektóre wartości w tym pliku zawierają wiele wierszy”. sugeruje, że być może nie musi to być plik CSV. Poza tym format pytań i odpowiedzi ma zastosowanie również do innych czytelników i może być dobrym wyborem dla niektórych z nich (nawet jeśli OP musiałby używać CSV). Uważam, że twój głos przeciwny jest nierozsądny (nadal dziękuję za wyjaśnienie, dlaczego).
dtldarek

1
Właściwie to była dla mnie najlepsza opcja; dziękuję za zasugerowanie tego!
Jordan Grey

8

Warto zauważyć, że jeśli plik .CSV ma pola zawinięte w podwójne cudzysłowy, które zawierają podziały wierszy, program Excel nie zaimportuje poprawnie pliku .CSV, jeśli plik .CSV jest zapisany w formacie UTF-8. Program Excel traktuje podział wiersza tak, jakby był CR / LF i rozpoczyna nowy wiersz. Arkusz kalkulacyjny jest zniekształcony. Wydaje się, że jest to prawdą, nawet jeśli jako separatory pól używane są średniki (zamiast przecinków).

Problem można rozwiązać, edytując plik CSV za pomocą Notatnika systemu Windows, używając polecenia Plik> Zapisz jako ..., aby zapisać plik, a przed zapisaniem pliku należy zmienić kodowanie pliku z UTF-8 na ANSI. Po zapisaniu pliku w formacie ANSI stwierdzam, że Microsoft Excel 2013 działający w systemie Windows 7 Professional zaimportuje plik poprawnie.


7

Nowa linia wewnątrz wartości wydaje się działać, jeśli jako separatora użyjesz średnika zamiast przecinka lub tabulatora i użyjesz cudzysłowów.

Działa to zarówno w programie Excel 2010, jak i Excel 2000. Jednak, co zaskakujące, działa tylko wtedy, gdy otwierasz plik jako nowy arkusz kalkulacyjny, a nie kiedy importujesz go do istniejącego arkusza kalkulacyjnego przy użyciu funkcji importu danych.


tak, ale wtedy nie znalazłem opcji, aby zakończyć linię średnikiem w programie Excel
GusDeCooL

A jeśli niektóre dane tekstowe zawierają średnik? To by nie zadziałało.
htm11h

4

Na komputerze znak ASCII # 10 jest tym, co chcesz umieścić nową linię w wartości.

Jednak po przesłaniu go do programu Excel musisz upewnić się, że zawijanie słów jest włączone dla komórek wieloliniowych, w przeciwnym razie nowa linia pojawi się jako kwadratowe pole.


3

To nie zadziała, jeśli spróbujesz zaimportować plik do EXCEL.

Skojarz rozszerzenie pliku csv z EXCEL.EXE, aby móc wywołać EXCEL poprzez dwukrotne kliknięcie pliku csv.

Tutaj umieszczam tekst, po którym następuje znak nowej linii, po którym następuje więcej tekstu ORAZ zamykam cały ciąg w podwójne cudzysłowy.

Nie używaj CR, ponieważ EXCEL umieści część ciągu w następnej komórce.

""text" + NL + "text""

Zobaczysz to po wywołaniu EXCEL. Być może będziesz musiał automatycznie dopasować wysokość, aby zobaczyć to wszystko. Miejsce przerwania linii zależy od szerokości komórki.

2

DATA

Oto kod w Basicu

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

2

Znalazłem to i zadziałało

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

Wtedy musisz mieć załączone rzeczy

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

Wtedy, gdy musisz coś napisać - na przykład HTML, który zawiera hasło „możesz to zrobić

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

Nowe linie kończą się na . PHP_EOL

Koniec skryptu wypisuje link, aby użytkownik mógł pobrać plik.

echo 'Click <a href="myfile.csv">here</a> to download file';

1

Pliki UTF zawierające BOM spowodują, że program Excel będzie traktował nowe wiersze dosłownie, nawet jeśli to pole jest otoczone cudzysłowami. (Przetestowany Excel 2008 Mac)

Rozwiązaniem jest uczynienie z nowych wierszy powrotu karetki (CHR 13), a nie wysuwu wiersza.


Wydaje się, że program Excel 2016 poprawnie traktuje mój plik CSV, nawet jeśli ma on zestawienie komponentów UTF8. Jednak różnica polega na użyciu „;” jako separator pól (co robi Excel dla wszystkich ustawień narodowych, które mają znak „,” jako separator dziesiętny).
Ale

1

Przetestuj to: to w pełni działa dla mnie: Umieść następujące wiersze w xxxx.csvpliku

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

Otwórz w programie Excel.

w niektórych przypadkach otworzy się bezpośrednio, w przeciwnym razie konieczne będzie użycie kolumny do konwersji danych. rozszerz szerokość kolumny i naciśnij przycisk zawijania tekstu. lub sformatuj komórki i aktywuj zawijanie tekstu.

i dziękuję za inne sugestie, ale nie zadziałały. Jestem w czystej środowisku Windows i nie chciałem bawić się Unicode lub inną zabawną rzeczą.

W ten sposób wstawiasz formułę z csv do excel. Ta metoda pracy może mieć wiele zastosowań. (zwróć uwagę na = przed cudzysłowami)

pd: W swoich sugestiach prosimy o umieszczenie próbek danych, a nie tylko kodu.


1

umieszczenie „\ r” na końcu każdego wiersza w rzeczywistości spowodowało łamanie linii w programie Excel, ale w pliku .csv zniknęło i pozostawiło brzydki bałagan, w którym każdy wiersz był zgniatany z następnym bez spacji i łamania linii


0

Sposób, w jaki to robimy (używamy VB.Net), polega na umieszczeniu tekstu w nowych wierszach w Chr (34), który jest znakiem reprezentującym podwójne cudzysłowy, i zastąpieniu wszystkich znaków CR-LF LF.


0

Zwykle nowa linia to „\ r \ n”. W moim pliku CSV zastąpiłem „\ r” pustą wartością. Oto kod w Javascript:

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

Kiedy otwieram plik CSV w MS Excel, działa dobrze. Jeśli wartość ma wiele linii, pozostanie w jednej komórce w arkuszu Excel.


0

Tylko w przypadku otwierania pliku składnia to

 ,"one\n
 two",...

Najważniejsze jest to, że po pierwszym „,” nie ma spacji . Zwykle spacje są w porządku i są przycinane, jeśli ciąg nie jest cytowany. Ale poza tym paskudny. Zajęło mi trochę czasu, zanim to rozgryzłem.

Nie ma znaczenia, czy linia jest zakończona \ n, czy \ c \ n.

Upewnij się, że rozszerzyłeś pasek formuły, abyś mógł faktycznie zobaczyć tekst w komórce (dostałem mnie po długim dniu ...)

Teraz oczywiście, File Open nie będzie poprawnie obsługiwał UTF-8 (chyba że używa się sztuczek).

Excel> Dane> Pobierz dane zewnętrzne > Z tekstu

Można ustawić w tryb UTF-8 (jest daleko w dół listy czcionek). Jednak w takim przypadku nowe linie wydają się nie działać i nie wiem, jak to naprawić.

(Można by pomyśleć, że po 30 latach stwardnienie rozsiane zrobi to dobrze.)


0

W Excel 365 podczas importu pliku:

Dane -> Z tekstu / CSV -> Wybierz plik> Przekształć dane -> Konfiguracja źródła danych -> Wybierz źródło danych -> Kliknij Edytuj źródło -> Na liście rozwijanej podziału wiersza wybierz opcję Ignoruj ​​podziały wierszy w cudzysłowach.

Powyższy tekst został przetłumaczony z języka portugalskiego, więc sformułowanie może być inne w języku angielskim.


-1

możesz zrobić następny "\"Value3 Line1 Value3 Line2\"". U mnie działa generowanie pliku csv w java


-2

Oto ciekawe podejście z wykorzystaniem 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

Drukowanie nowego wiersza HTML <br/>w treści i otwieranie w programie Excel będzie działać dobrze na każdym programie Excel


-3

Możesz użyć skrótu klawiaturowego ALT + Enter.

  1. Wybierz komórkę, którą chcesz edytować
  2. wejdź w tryb edycji, klikając go dwukrotnie lub naciskając klawisz F2 3. Naciśnij klawisze Alt + enter. Spowoduje to utworzenie nowej linii w komórce

Jak to zintegrować z generowaniem plików CVS?
jikuja,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.