Generazione di file CSV per Excel, come avere una nuova riga all'interno di un valore


158

Devo generare un file per Excel, alcuni dei valori in questo file contengono più righe.

c'è anche del testo non inglese, quindi il file deve essere Unicode.

Il file che sto generando ora assomiglia a questo: (in UTF8, con testo non inglese mischiato e con molte righe)

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

Si noti che il valore a più righe è racchiuso tra virgolette doppie, con una nuova riga normale di ogni giorno.

Secondo quello che ho trovato sul web questo dovrebbe funzionare, ma non vince, almeno non file Excel 2007 e UTF8, Excel considera la terza riga come la seconda riga di dati non come la seconda riga della prima riga di dati .

Questo deve essere eseguito sui computer dei miei clienti e non ho alcun controllo sulla loro versione di Excel, quindi ho bisogno di una soluzione che funzionerà con Excel 2000 e versioni successive.

Grazie

EDIT: ho "risolto" il mio problema avendo due opzioni CSV, una per Excel (Unicode, tab separato, nessuna nuova riga nei campi) e una per il resto del mondo (UTF8, CSV standard).

Non quello che stavo cercando, ma almeno funziona (finora)


1
Cordiali saluti: Tutto questo funziona perfettamente in LibreOffice e importare un CSV è molto più semplice in primo luogo.
user2061057

9
La risposta accettata sugli spazi extra è incredibilmente confusa ora che hai modificato le tue domande e rimosso gli spazi ...
Matti Virkkunen,

Risposte:


70

Dovresti avere caratteri di spazio all'inizio dei campi SOLO dove i caratteri di spazio fanno parte dei dati. Excel non eliminerà gli spazi iniziali. Otterrai spazi indesiderati nelle intestazioni e nei campi dati. Peggio ancora, "ciò che dovrebbe "proteggere" l'interruzione di riga nella terza colonna verrà ignorato perché non è all'inizio del campo.

Se nel file sono presenti caratteri non ASCII (codificati in UTF-8), dovresti avere una DBA UTF-8 (3 byte, hex EF BB BF) all'inizio del file. Altrimenti Excel interpreterà i dati in base alla codifica predefinita della tua locale (es. Cp1252) invece di utf-8, e i tuoi caratteri non ASCII verranno eliminati.

I seguenti commenti si applicano a Excel 2003, 2007 e 2013; non testato su Excel 2000

Se apri il file facendo doppio clic sul suo nome in Esplora risorse, tutto funziona correttamente.

Se lo apri da Excel, i risultati variano:

  1. Hai solo caratteri ASCII nel file (e nessuna DBA): funziona.
  2. Hai caratteri non ASCII (codificati in UTF-8) nel file, con una DBA UTF-8 all'inizio: riconosce che i tuoi dati sono codificati in UTF-8 ma ignora l'estensione csv e ti inserisce nel testo Importazione non guidata , purtroppo con il risultato di avere il problema di interruzione di linea.

Le opzioni includono:

  1. Addestrare gli utenti a non aprire i file da Excel :-(
  2. Prendi in considerazione la possibilità di scrivere direttamente un file XLS ... ci sono pacchetti / librerie disponibili per farlo in Python / Perl / PHP / .NET / etc

1
Grazie, ho risolto il problema degli spazi iniziali nella domanda, ho digitato manualmente l'esempio CSV e non ho copiato e incollato da un file reale, il file reale non include quegli spazi, buona cattura.
Nir

@Nir: ora parliamo del tuo vero problema. Ciò significa che hai avuto una DBA UTF-8 e hai aperto il file da Excel e hai ottenuto che l'importazione guidata testo non riconosceva che la tua nuova linea Value3 fosse "protetta" - corretta? O forse non avevi una distinta base UTF-8 e dovevi dire al TIW che i tuoi dati erano codificati UTF-8 e continuavano a confondere la nuova riga?
John Machin,

E se volessi usare | come separatore di campo, nuova riga come separatore di record, usa "per proteggere il contenuto dei campi di testo, e i campi di testo potrebbero contenere |," e nuova riga. È possibile?
Giorgio,

1
Cordiali saluti: Ho Excel2007 e CSV esportati dal sistema Redmine. Dopo aver aggiunto la BOM UTF-8 (EFBBBF) all'inizio, Excel ha aperto il file perfettamente. Le nuove righe incorporate nel colunm "descrizione problema" vengono elaborate correttamente e la struttura delle righe non viene danneggiata e tutti i caratteri nazionali vengono letti correttamente (sono stati eliminati durante la lettura senza la distinta base UTF8). Excel non ha nemmeno visualizzato la procedura guidata di importazione del testo. Attualmente, quel CSV ora ha EFBBBFintestazione, usa 0Acome separatore di riga e 0D0Acome nuova riga all'interno delle stringhe nelle celle di testo.
quetzalcoatl,

1
Se stai cercando di ottenere Excel per OS X per leggere correttamente CSV, così come Excel per Windows, ecco una grande risorsa: stackoverflow.com/questions/4348802/…
Alexandre R. Janini

25

Dopo molte modifiche, ecco una configurazione che funziona generando file su Linux, leggendo su Windows + Excel, anche se il formato newline incorporato non è conforme allo standard :

  • Le newline all'interno di un campo devono essere \ n (e ovviamente citate tra virgolette)
  • Fine della registrazione: \ r \ n
  • Assicurati di non iniziare un campo con uguale, altrimenti verrà trattato come una formula e troncato

In Perl, ho usato Text :: CSV per fare questo come segue:

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
Sì, \ r \ n l'ha fatto. Posso confermare che funziona con Windows + Excel, OSX + Numbers e Google Docs.
Yorick Sijsling,

3
Usando \ n (anche provato \ n) in un campo racchiuso tra "e usando \ r \ n per dividere le righe. Ancora non ho risolto questo problema per me in Excel 2010. Ho provato ANSI e UTF8-con-BOM. Nessun successo
nl-x

1
Ma questo perché uso | come separatore di campo. Se io uso; come separatore di campo, il problema esiste ancora durante l'importazione dei dati CSV, ma il problema scompare quando si apre il CSV facendo doppio clic su di esso in Esplora file.
nl-x

2
La risposta di Ian non funziona per me in Excel 2003/2010 su Windows 7. Ho provato a utilizzare un editor esadecimale per modificare il mio file BOM UTF-8 e ho rimosso 0D (\ r) dai bit '0D0A' (\ r \ n) per newline all'interno dei campi. Ma non funziona
Dan W,

Questa risposta ha funzionato per me (senza modifiche!) Usando Excel 2010 e Windows 7; anche usando perl v5.14.2 fornito con cygwin. Le mie nuove linee incorporate erano tutte \n. Grazie
Ardnew

21

Recentemente ho avuto un problema simile, l'ho risolto importando un file HTML , l'esempio di base sarebbe così:

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

Lo so, non è un CSV e potrebbe funzionare in modo diverso per varie versioni di Excel, ma penso che valga la pena provare.

Spero che aiuti ;-)


35
@GusDeCooL La formulazione della prima frase di OP "Ho bisogno di generare un file per Excel, alcuni dei valori in questo file contengono più righe". suggerisce che forse non è necessario che sia un file CSV. Inoltre, il formato di domande e risposte si applica anche ad altri lettori e potrebbe essere una scelta praticabile per alcuni di essi (anche se l'OP doveva usare CSV). Trovo irragionevole il tuo voto negativo (ancora, grazie per aver spiegato il perché).
dtldarek,

1
Questa è stata l'opzione migliore per me, in effetti; grazie per averlo suggerito!
Jordan Grey

8

Vale la pena notare che quando un file .CSV ha campi racchiusi tra virgolette doppie che contengono interruzioni di riga, Excel non importerà correttamente il file .CSV se il file .CSV è scritto nel formato UTF-8. Excel considera l'interruzione di linea come se fosse CR / LF e inizia una nuova riga. Il foglio di calcolo è confuso. Ciò sembra essere vero anche se i punti e virgola vengono utilizzati come delimitatori di campo (anziché virgole).

Il problema può essere risolto utilizzando Blocco note di Windows per modificare il file .CSV, usando File> Salva con nome ... per salvare il file e prima di salvare il file, modificando la codifica del file da UTF-8 a ANSI. Una volta salvato il file in formato ANSI, allora trovo che Microsoft Excel 2013 in esecuzione su Windows 7 Professional importerà il file correttamente.


7

Newline all'interno di un valore sembra funzionare se si utilizza il punto e virgola come separatore, anziché virgola o tabulazione e si utilizzano le virgolette.

Questo funziona per me sia in Excel 2010 che Excel 2000. Tuttavia, sorprendentemente, funziona solo quando si apre il file come nuovo foglio di calcolo, non quando lo si importa in un foglio di calcolo esistente utilizzando la funzione di importazione dei dati.


sì, ma poi non ho trovato l'opzione per fare la fine del punto e virgola in Excel
GusDeCooL

Cosa succede se alcuni dei dati di testo attuali contengono punti e virgola? Questo non funzionerebbe.
htm11h

4

Su un PC, il carattere ASCII n. 10 è ciò che si desidera posizionare una nuova riga all'interno di un valore.

Una volta ottenuto in Excel, tuttavia, è necessario assicurarsi che il ritorno a capo automatico sia attivato per le celle multilinea o che la nuova riga venga visualizzata come una casella quadrata.


3

Questo non funzionerà se si tenta di importare il file in EXCEL.

Associare l'estensione csv a EXCEL.EXE in modo da poter richiamare EXCEL facendo doppio clic sul file csv.

Qui inserisco del testo seguito dal carattere NewLine seguito da un altro testo e racchiudendo l'intera stringa tra virgolette doppie.

Non usare un CR poiché EXCEL inserirà parte della stringa nella cella successiva.

""text" + NL + "text""

Quando invochi EXCEL, vedrai questo. Potrebbe essere necessario ridimensionare automaticamente l'altezza per vederlo tutto. Il punto in cui le interruzioni di riga dipenderanno dalla larghezza della cella.

2

DATA

Ecco il codice in Basic

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

2

Ho trovato questo e ha funzionato per me

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

Quindi dove è necessario disporre di materiale chiuso

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

Quindi, quando è necessario scrivere qualcosa, come HTML che includa "puoi farlo

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

Le nuove linee finiscono con . PHP_EOL

La fine dello script stampa un collegamento in modo che l'utente possa scaricare il file.

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

1

I file UTF che contengono una distinta componenti fanno sì che Excel tratti letteralmente le nuove righe anche in quel campo è racchiuso tra virgolette. (Mac Excel 2008 testato)

La soluzione consiste nel rendere qualsiasi nuova riga un ritorno a capo (CHR 13) anziché un avanzamento riga.


Excel 2016 sembra trattare correttamente il mio file CSV anche se ha una DBA UTF8. Tuttavia, ciò che ha fatto la differenza è usare ';' come separatore di campo (che è ciò che fa Excel per tutte le impostazioni locali che hanno ',' come separatore decimale).
Ale

1

Prova questo: funziona perfettamente per me: inserisci le seguenti righe in un xxxx.csvfile

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

Apri con Excel.

in alcuni casi si aprirà direttamente altrimenti sarà necessario utilizzare la conversione da colonna a dati. espandi la larghezza della colonna e premi il pulsante di testo a capo. o formatta le celle e attiva il testo a capo.

e grazie per gli altri suggerimenti, ma non hanno funzionato per me. Sono in un ambiente Windows puro e non volevo giocare con Unicode o altre cose divertenti.

In questo modo metti una formula da CSV a Excel. Possono essere molti gli usi per questo metodo di lavoro. (nota il = prima delle virgolette)

pd: nei tuoi suggerimenti ti preghiamo di inserire alcuni esempi dei dati non solo del codice.


1

mettere "\ r" alla fine di ogni riga ha effettivamente avuto l'effetto di interruzioni di riga in Excel, ma nel .csv è svanito e ha lasciato un brutto pasticcio in cui ogni riga è stata schiacciata contro la successiva senza spazio e senza interruzioni di riga


0

Il modo in cui lo facciamo (usiamo VB.Net) è racchiudere il testo con nuove righe in Chr (34) che è il carattere che rappresenta le doppie virgolette e sostituire tutti i caratteri CR-LF per LF.


0

Normalmente una nuova riga è "\ r \ n". Nel mio CSV, ho sostituito "\ r" con un valore vuoto. Ecco il codice in Javascript:

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

Quando apro il CSV in MS Excel, ha funzionato bene. Se un valore ha più righe, rimarrà all'interno di 1 singola cella nel foglio Excel.


0

Solo per File Open , la sintassi è

 ,"one\n
 two",...

La cosa fondamentale è che non c'è spazio dopo il primo ",". Normalmente gli spazi vanno bene e vengono tagliati se la stringa non è quotata. Ma per il resto brutto. Mi ci è voluto un po 'per capirlo.

Non sembra importare se la linea è terminata \ n oppure \ c \ n.

Assicurati di espandere la barra della formula in modo da poter effettivamente vedere il testo nella cella (mi ha preso dopo una lunga giornata ...)

Ora, naturalmente, File Open non supporterà UTF-8 correttamente (a meno che uno non usi trucchi).

Excel> Dati> Ottieni dati esterni > Da testo

Può essere impostato in modalità UTF-8 (è in fondo all'elenco dei caratteri). Tuttavia, in quel caso le nuove linee non sembrano funzionare e non so come risolverlo.

(Si potrebbe pensare che dopo 30 anni la SM avrebbe capito bene queste cose.)


0

In Excel 365 durante l'importazione del file:

Dati -> Da testo / CSV -> Seleziona file> Trasforma dati -> Configurazione origine dati -> Seleziona origine dati -> Fai clic su Modifica origine -> Nel menu a discesa dell'interruzione di riga seleziona Ignora interruzioni di riga tra virgolette.

Il testo sopra è stato tradotto dal portoghese, quindi la formulazione potrebbe essere diversa in inglese.


-1

puoi fare il prossimo "\"Value3 Line1 Value3 Line2\"". Funziona per me generando un file CSV in Java


-2

Ecco un approccio interessante usando 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

La stampa di una nuova riga HTML <br/>nel contenuto e l'apertura in Excel funzionerà perfettamente su qualsiasi Excel


-3

È possibile utilizzare la scorciatoia da tastiera ALT + Invio.

  1. Seleziona la cella che desideri modificare
  2. accedere alla modalità di modifica facendo doppio clic o premendo F2 3. Premere Alt + invio. Questo creerà una nuova linea nella cella

Come lo integri nella generazione di file CVS?
jikuja,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.