2009-08-06 5 views
119

Ho bisogno di generare un file per Excel, alcuni dei valori in questo file contengono più righe.Generazione di file CSV per Excel, come avere una nuova riga all'interno di un valore

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

Il file che sto generando appare come segue: (in UTF8, con il testo non inglese mescolato in e con un sacco di linee)

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

Nota il valore più righe è racchiuso tra virgolette doppie con una normale newline di tutti i giorni.

In base a ciò che ho trovato sul Web questo dovrebbe funzionare, ma non lo fa, almeno non vincere i file Excel 2007 e UTF8, Excel considera la terza riga come seconda riga di dati non come seconda riga di la prima riga di dati.

Questo deve essere eseguito sulle macchine dei miei clienti e non ho il controllo sulla loro versione di Excel, quindi ho bisogno di una soluzione che funzioni con Excel 2000 e versioni successive.

Grazie

EDIT: Ho "risolto" il mio problema da avere due opzioni CSV, uno per Excel (Unicode, tab separati, non ritorni a capo nei campi) e uno per il resto del mondo (UTF8, CSV di serie).

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

+1

FYI: Tutto questo funziona perfettamente in LibreOffice e l'importazione di un CSV è molto più facile in primo luogo. – user2061057

+2

La risposta accettata sugli spazi aggiuntivi è incredibilmente confusa ora che hai modificato le tue domande e rimosso gli spazi ... –

risposta

54

Si dovrebbero avere caratteri di spazio all'inizio dei campi SOLO dove i caratteri dello spazio fanno parte dei dati. Excel non cancellerà gli spazi iniziali. Otterrai spazi indesiderati nelle tue intestazioni e campi di dati. Peggio ancora, lo " che dovrebbe "proteggere" quell'interruzione di riga nella terza colonna verrà ignorata perché non si trova all'inizio del campo.

Se si dispone di caratteri non-ASCII (codificati in UTF-8) nel file, si dovrebbe avere un UTF-8 BOM (3 byte, hex EF BB BF) all'inizio del file. Altrimenti, Excel interpreterà i dati in base alla codifica predefinita delle tue impostazioni locali (ad es. Cp1252) anziché a utf-8, e i tuoi caratteri non ASCII verranno spostati nel cestino.

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

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

Se si apre dall'interno di Excel, i risultati variano:

  1. Hai solo caratteri ASCII nel file (e non BOM): opere.
  2. Nel file sono presenti caratteri non ASCII (codificati in UTF-8), con un BOM UTF-8 all'inizio: riconosce che i dati sono codificati in UTF-8 ma ignora l'estensione csv e ti fa cadere nel Import-a-Wizard di testo, sfortunatamente con il risultato che si ottiene il problema di interruzione di riga.

opzioni includono:

  1. del treno gli utenti non aprire i file da Excel :-(
  2. non crei 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 -Paste da un file reale, il file reale non include quegli spazi, buona cattura. – Nir

+0

@Nir: ora parliamo del tuo vero problema. Ciò significa che hai un BOM UTF-8 e hai aperto il file da Excel e hai ottenuto l'Importazione guidata testo non riconoscendo che il tuo Value3 newline dovrebbe essere "protetto" - corretto? O forse non disponevi di un BOM UTF-8 e dovevi dire alla TIW che i tuoi dati erano codificati in UTF-8 e che ancora pasticciavano il newline? –

+0

Cosa succede se voglio usare | come separatore di campo, nuova riga come separatore di record, utilizzare "per proteggere il contenuto dei campi di testo e i campi di testo potrebbero contenere |," e una nuova riga. È possibile? – Giorgio

3

Su un PC, carattere ASCII # 10 è quello che si desidera inserire un ritorno a capo all'interno di un valore.

Una volta ottenuto in Excel, tuttavia, è necessario assicurarsi che il ritorno a capo sia attivato per le celle su più righe o che il ritorno a capo sia visualizzato come una casella quadrata.

0

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

0

ho trovato questo e ha funzionato per me

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

Allora dove è necessario avere roba racchiuso

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

Poi, quando si è necessario scrivere qualcosa - come HTML che include "puoi farlo

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

nuove linee terminano con . PHP_EOL

La fine dello script stampa un link in modo che l'utente può scaricare il file.

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

Newline all'interno un valore sembra funzionare se si usa il punto e virgola come separatore, invece di virgola o scheda, e usare le virgolette.

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

+0

sì, ma poi non ho trovato l'opzione per rendere la linea di fondo con punto e virgola in excel – GusDeCooL

+0

E se alcuni dei dati di testo reale contengono i due punti? Questo non funzionerebbe. – htm11h

1

I file UTF che contengono una distinta base causeranno che Excel tratti letteralmente le nuove righe anche in quel campo è racchiuso tra virgolette. (Testato Excel 2008 Mac)

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

20

Dopo un sacco di tweaking, ecco una configurazione che funziona i file che generano su Linux, la lettura su Windows + Excel

  • Newlines all'interno di un campo deve essere \ n (e, ovviamente, citato tra virgolette doppie)
  • fine della registrazione: \ r \ n
  • assicurarsi che non si inizia un campo con eguali, altrimenti viene trattato come una formula e tronca

In Perl, ho usato Text :: CSV 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); 
+2

Sì, lo ha fatto \ r \ n. Posso confermare questo funziona con Windows + Excel, OSX + Numbers e Google Docs. –

+1

Utilizzo di \ n (anche provato \ n) in un campo racchiuso tra "e utilizzando \ 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 –

+0

Ma questo è perché io uso | come separatore di campo.Se io uso, come separatore di campo, il problema esiste ancora quando si importano dati CSV, ma il problema scompare quando si apre CSV facendo doppio clic su File Explorer. –

-2

Qui è un approccio interessante utilizzando 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");     
13

Recentemente ho avuto problema simile, ho risolto importando un file di HTML, l'esempio della linea di base sarebbe come questo:

<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 file CSV, e potrebbe funzionare in modo diverso per le varie versioni di Excel, ma penso che vale la pena provare.

Spero che questo aiuta ;-)

+0

downvote, non un CSV. – GusDeCooL

+20

@GusDeCooL La dicitura della prima frase dell'OP "Devo generare un file per Excel, alcuni dei valori in questo file contengono più righe." suggerisce che forse non è necessario essere un file CSV. Inoltre, il formato Q & A si applica anche ad altri lettori, e potrebbe essere una scelta praticabile per alcuni di essi (anche se l'OP doveva usare CSV). Trovo irraggiungibile il tuo downvote (ancora, grazie per aver spiegato il perché). – dtldarek

+0

È una buona idea. –

2

Questo non funziona se si tenta di importare il file in Excel.

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

Qui inserisco del testo seguito da NewLine Char seguito da un altro testo E racchiudendo l'intera stringa con virgolette doppie.

Non utilizzare 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. Dove le interruzioni di riga dipenderanno dalla larghezza della cella.

DATA

Ecco il codice in base

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

Stampa di una nuova riga HTML <br/> nel contenuto e l'apertura in Excel funzionerà bene su qualsiasi eccellono

-1

è possibile fare il prossimo "\" Value3 Line1 Value3 Line2 \ "". Funziona per me generare un file csv in java

5

Vale la pena notare che quando un file .CSV ha campi racchiusi tra virgolette che contengono interruzioni di riga, Excel non importerà correttamente il file .CSV se il file .CSV è scritto in formato UTF-8. Excel considera l'interruzione di riga 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 sono usati come delimitatori di campo (invece di virgole).

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

+0

Grazie, questo ha funzionato per Excel 2016. – Henry

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 una singola cella nel foglio Excel.

1

Verifica questo: Funziona perfettamente per me: Mettere le seguenti righe in un file di 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 

aperto con Excel.

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

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

In questo modo si mette una formula da csv per eccellere. Potrebbe essere molti usi per questo metodo di lavoro. (notare il = prima delle virgolette)

pd: Nei suggerimenti si prega di inserire alcuni campioni dei dati non solo il codice.

1

mettendo "\ r" alla fine di ogni riga ha effettivamente avuto l'effetto di interruzioni di riga in Excel, ma in .csv è svanito e ha lasciato un brutto pasticcio in cui ogni riga era schiacciata contro il successivo senza spazio e senza line-breaks

0

È possibile utilizzare la scorciatoia da tastiera ALT + Invio.

  1. Selezionare la cella che si desidera modificare
  2. attivare la modalità Modifica facendo doppio clic su di esso o premendo F2 3.Press Alt + Invio. Questo creerà una nuova riga nella cella