È possibile forzare Excel a riconoscere automaticamente i file CSV UTF-8?


455

Sto sviluppando una parte di un'applicazione responsabile dell'esportazione di alcuni dati in file CSV. L'applicazione utilizza sempre UTF-8 a causa della sua natura multilingue a tutti i livelli. Ma l'apertura di tali file CSV (contenenti ad esempio segni diacritici, lettere cirilliche, lettere greche) in Excel non ottiene i risultati previsti mostrando qualcosa di simile Г„/Г¤, Г–/Г¶. E non so come forzare Excel a capire che il file CSV aperto è codificato in UTF-8. Ho anche provato a specificare la distinta base UTF-8 EF BB BF, ma Excel lo ignora.

C'è qualche soluzione?

PS Quali strumenti potrebbero comportarsi potenzialmente come Excel?


AGGIORNARE

Devo dire che ho confuso la comunità con la formulazione della domanda. Quando stavo ponendo questa domanda, ho chiesto un modo per aprire un file CSV UTF-8 in Excel senza problemi per un utente, in modo fluido e trasparente. Tuttavia, ho usato una formulazione sbagliata che mi chiedeva di farlo automaticamente . È molto confuso e si scontra con l'automazione delle macro VBA. Ci sono due risposte a questa domanda che apprezzo di più: la prima risposta di Alex https://stackoverflow.com/a/6002338/166589 e ho accettato questa risposta; e il secondo di Mark https://stackoverflow.com/a/6488070/166589che sono apparsi poco dopo. Dal punto di vista dell'usabilità, a Excel sembrava mancare un buon supporto CSV UTF-8 facile da usare, quindi ritengo che entrambe le risposte siano corrette e ho accettato la risposta di Alex prima perché affermava davvero che Excel non era in grado di fare quello in modo trasparente. Questo è ciò che ho confuso automaticamente qui. La risposta di Mark promuove un modo più complicato per gli utenti più avanzati di raggiungere il risultato atteso. Entrambe le risposte sono fantastiche, ma quella di Alex si adatta un po 'meglio alla mia domanda non chiaramente specificata.


AGGIORNAMENTO 2

Cinque mesi dopo l'ultima modifica, ho notato che la risposta di Alex è scomparsa per qualche motivo. Spero davvero che non sia stato un problema tecnico e spero che non ci siano più discussioni su quale risposta sia maggiore adesso. Quindi sto accettando la risposta di Mark come la migliore.


1
Puoi usare file delimitati da tabulazioni? In tal caso, potresti avere più fortuna.
Tim Perry,

8
Office 2010+: lavori migliori: UTF-16LE con distinta componenti e \tcome delimitatore. Funzionerà con impostazioni Excel inglesi e non inglesi. Può premere Ctrl-Ssenza selezionare il formato del file, ecc. Conserverà i caratteri Unicode.
Sebastian,

@Duncan, francamente, sono confuso ed è difficile "giudicare". Ho accettato la risposta di alex più di 2 anni fa (Q e A il 14 maggio), e poi Mark ha risposto suggerendo una soluzione complicata (in realtà non l'ho verificata) che ha segnato sorprendentemente ha segnato più punti alla mia domanda che sorprendentemente è diventata anche popolare. In realtà abbiamo rifiutato il supporto Excel nel mio progetto molto tempo fa, e non voglio togliere il punteggio di reputazione di alex, perché Excel sembrava, e probabilmente sembra ancora (per favore correggimi se sbaglio), di gestire male CSV. È difficile da dire, scusa.
Lyubomyr Shaydariv,

2
La risposta di Alex è stata cancellata da un moderatore. Non è stata data alcuna spiegazione, ma se hai abbastanza reputazione puoi ancora vederlo.
Mark Ransom,

1
Dal momento che le macchine del tempo non esistono ancora, non devo essere d'accordo.
osexpert,

Risposte:


398

Alex ha ragione, ma dato che devi esportare in CSV, puoi dare questo consiglio agli utenti quando aprono i file CSV:

  1. Salva il file esportato come csv
  2. Apri Excel
  3. Importa i dati utilizzando Dati -> Importa dati esterni -> Importa dati
  4. Seleziona il tipo di file "csv" e cerca il tuo file
  5. Nella procedura guidata di importazione, modifica File_Origin in "65001 UTF" (o scegli l'identificatore del carattere lingua corretto)
  6. Cambia il delimitatore in virgola
  7. Seleziona dove importare e Fine

In questo modo i caratteri speciali dovrebbero essere visualizzati correttamente.


163

Il marcatore di ordine byte UTF-8 indicherà Excel 2007+ per il fatto che stai utilizzando UTF-8. (Vedi questo post SO ).

Nel caso in cui qualcuno abbia gli stessi problemi, la classe di codifica UTF8 di .NET non genera un marcatore di ordine byte in una GetBytes()chiamata. Devi usare gli stream (o usare una soluzione alternativa ) per ottenere l'output della distinta componenti.


18
Inserire una DBA UTF-8 sembra essere la strada da percorrere. Dopodiché è trasparente.
vy32,

12
Uso Notepad ++ per convertire facilmente il .csv da UTF-8aUTF-8 with BOM
Sébastien il

3
Sì, la migliore soluzione. Molti post confusi sull'impostazione delle intestazioni nelle risposte http. Questo risolve il problema. Lo stesso si può vedere quando si apre il file nel blocco note e si salva all'indietro usando l'opzione UTF-8. Aggiunge anche l'indicatore dell'ordine dei byte.
user369142

1
@Elmue: ho pensato che forse (come me) pensava che lo stesse salvando con un marcatore di ordine byte, ma non perché una biblioteca non funzionasse come pensava. Ho trovato utile aggiungere questa risposta, ed evidentemente anche altre persone l'hanno trovata utile. Ad ogni modo, sembra una risposta migliore che dire di non usare CSV, o istruire gli utenti su come aprire il file in un modo bizzarro.
StriplingWarrior il

1
La versione Mac di Excel sembra ignorare ancora la DBA. (Excel per Mac 2011.)
Thomas Andrews,

74

Il bug con la DBA ignorata sembra essere stato corretto per Excel 2013. Ho avuto lo stesso problema con le lettere in cirillico, ma l'aggiunta del carattere della DBA \uFEFFha aiutato.


8
Da quando ho aggiunto \ uFEFF all'inizio del mio file CSV (generato in Java), Excel è in grado di aprirli correttamente! Thx
Galdo,

16
di quel risolto il mio problema anche in php che appare così: $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText;
Abdullah,

@updola grazie mille per questo commento, mi ha risparmiato ore
Nathan Hayfield

UTF-8, per definizione, non usa né dovrebbe usare i caratteri DBA. Il modo in cui Excel legge la distinta componenti rovina il vantaggio di UTF-8 su Unicode, che è la retrocompatibilità con ASCII. L'aggiunta della DBA farà funzionare Excel, ma interromperà le letture di altri file UTF-8 / ASCII.
Nelson,

1
\ FE \ FF rende Mac OS Excel 2016 l'intero file come geroglifici giapponesi.
Nakilon,

56

È incredibile che ci siano così tante risposte ma nessuna risponde alla domanda:

"Quando stavo facendo questa domanda, ho chiesto un modo per aprire un file CSV UTF-8 in Excel senza alcun problema per un utente, ..."

La risposta contrassegnata come risposta accettata con oltre 200 voti positivi è inutile per me perché non voglio fornire ai miei utenti un manuale su come configurare Excel. A parte questo: questo manuale si applicherà a una versione di Excel ma altre versioni di Excel hanno menu e finestre di dialogo di configurazione diversi. Avresti bisogno di un manuale per ogni versione di Excel.

Quindi la domanda è come fare in modo che Excel mostri i dati UTF8 con un semplice doppio clic?

Beh, almeno in Excel 2007 questo non è possibile se si utilizzano file CSV perché la DBA UTF8 viene ignorata e vedrai solo immondizia. Questo fa già parte della domanda di Lyubomyr Shaydariv:

"Ho anche provato a specificare UTF-8 BOM EF BB BF, ma Excel lo ignora."

Faccio la stessa esperienza: scrivere dati russi o greci in un file CSV UTF8 con risultati DBA in spazzatura in Excel:

Contenuto del file CSV UTF8:

Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ

Risultato in Excel 2007:

CSV UTF8 Excel

Una soluzione è non usare affatto CSV. Questo formato è implementato così stupidamente da Microsoft che dipende dalle impostazioni della regione nel pannello di controllo se come separatore viene utilizzata la virgola o il punto e virgola . Quindi lo stesso file CSV potrebbe aprirsi correttamente su un computer ma non su un altro computer. "CSV" significa " Valori separati da virgola " ma, ad esempio, su un Windows tedesco di default il punto e virgola deve essere usato come separatore mentre la virgola non funziona. (Qui dovrebbe essere chiamato SSV = punti separati da punto e virgola) I file CSV non possono essere scambiati tra versioni di Windows in lingue diverse. Questo è un ulteriore problema al problema UTF-8.

Excel esiste da decenni. È un peccato che Microsoft non sia stata in grado di implementare una cosa di base come l'importazione CSV in tutti questi anni.


Tuttavia, se si inseriscono gli stessi valori in un file HTML e si salva quel file come file UTF8 con BOM con l'estensione XLS, si otterrà il risultato corretto.

Contenuto del file XLS UTF8:

<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>

Risultato in Excel 2007:

UTF8 HTML Excel

Puoi anche usare i colori in HTML che Excel mostrerà correttamente.

<style>
.Head { background-color:gray; color:white; }
.Red  { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>

Risultato in Excel 2007:

UTF8 HTML Excel

In questo caso solo la tabella stessa ha un bordo e linee neri. Se si desidera che TUTTE le celle visualizzino la griglia, questo è possibile anche in HTML:

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
    <head>
        <meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
        <xml>
            <x:ExcelWorkbook>
                <x:ExcelWorksheets>
                    <x:ExcelWorksheet>
                        <x:Name>MySuperSheet</x:Name>
                        <x:WorksheetOptions>
                            <x:DisplayGridlines/>
                        </x:WorksheetOptions>
                    </x:ExcelWorksheet>
                </x:ExcelWorksheets>
            </x:ExcelWorkbook>
        </xml>
    </head>
    <body>
        <table>
            <tr><td>Colum1</td><td>Column2</td></tr>
            <tr><td>Val1</td><td>Val2</td></tr>
            <tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
        </table>
    </body>
</html>

Questo codice consente anche di specificare il nome del foglio di lavoro (qui "MySuperSheet")

Risultato in Excel 2007:

inserisci qui la descrizione dell'immagine


1
Ed è anche incredibile che le persone rispondano ancora. :) Tuttavia, direi che CSV è morto: CSV è un formato di streaming semplice e mortale e, quando ero su quel progetto, lo usavamo molto pesantemente anche per l'interazione dei componenti. Non userei mai il formato HTML a causa della sua natura troppo rappresentativa, e non potrei mai fare in modo che gli utenti di quel progetto esportino i dati in HTML solo per renderlo compatibile con Excel. Excel ha fatto schifo con UTF-8 CSV, e non ho idea di cosa sia cambiato 5 anni da allora. Ma quei file delimitati da virgole, punti e virgola e tabulazioni sono una vera follia, immagino.
Lyubomyr Shaydariv,

5
Non è incredibile che le persone rispondano ancora alla tua domanda perché Google le porta qui: tutte con la stessa domanda: come faccio a ottenere stupido Excel per fare quello che voglio? Inserisci 3 parole in Google: "excel csv utf8" e la tua domanda è il PRIMO risultato in tutto il mondo. Hai scritto un bestseller!
Elmue,

8
Dato che hai dedicato del tempo a sottolineare come nessuna delle altre risposte qui induca Excel ad aprire correttamente un file CSV, vale la pena ricordare che questa risposta non lo fa neanche. La risposta inizialmente accettata (che è stata eliminata da un moderatore) ha raccomandato di esportare direttamente i dati in un file Excel o di esportare un file HTML e di consentire agli utenti di aprire il file in Excel. Entrambe queste soluzioni sono meno complicate del salvataggio di un file HTML con estensione XLS, ma non è stata proposta alcuna risposta che risponda effettivamente alla domanda.
StriplingWarrior il

3
@Warrior: "..ma non è stata proposta alcuna risposta che risponda effettivamente alla domanda." Questo non è corretto Ho risposto a questa domanda: almeno con Excel 2007 NON È POSSIBILE. Questa è la risposta definitiva. Se Excel ignora la DBA UTF8 e interpreta i dati come ANSI, non c'è modo di importare ad esempio testo greco o russo in Excel tramite CSV con un semplice doppio clic sul file (che era la domanda: "senza problemi per un utente" ). Ciò che propongo è una soluzione funzionante che funzioni con TUTTE le versioni di Excel con un doppio clic e non richiede passaggi aggiuntivi nei menu di Excel.
Elmue,

2
Non solo questo non risponde alla domanda, è del tutto sbagliato affermare che CSV è "legacy" e "dead". Solo perché non ne vedi l'uso, non significa che sia morto. Inoltre, chiaramente non capisci la sua storia o quanto sia ampiamente usata oggi. Questo è meglio di XML (a causa delle dimensioni dei pacchetti più piccoli) e il problema qui è come Microsoft semplicemente non segue uno standard per il formato UTF8. La risposta corretta sarebbe quella di utilizzare open office e non Microsoft poiché Microsoft non è mai stata brava a codificare in primo luogo.
Jeremy,

49

Abbiamo usato questa soluzione alternativa:

  1. Convertire CSV in UTF-16 LE
  2. Inserisci DBA all'inizio del file
  3. Usa la scheda come separatore di campo

1
Grazie! Ho provato tutte le altre risposte in questo thread, ma la conversione in UTF-8 semplicemente non ha funzionato. Quando ho provato UTF-16 con BOM ha funzionato all'istante.
Husky,

Per Excel per Mac 2011 ho avuto successo con i file csv little endian UTF-16
multidinamico

Grazie, questa soluzione è eccellente per dare ai miei utenti un csv unicode che possono aprire in Excel.
user1073075

21

Ha avuto gli stessi problemi con i file CSV generati da PHP. Excel ha ignorato la distinta componenti quando è stato definito il separatore tramite"sep=,\n" all'inizio del contenuto (ma ovviamente dopo la DBA).

Quindi l'aggiunta di una DBA ( "\xEF\xBB\xBF") all'inizio del contenuto e l'impostazione del punto e virgola come separatore tramite fputcsv($fh, $data_array, ";");il trucco.


13

Ho avuto lo stesso problema in passato (come produrre file che Excel può leggere e anche altri strumenti possono leggere). Stavo usando TSV piuttosto che CSV, ma è emerso lo stesso problema con le codifiche.

Non sono riuscito a trovare un modo per far sì che Excel riconoscesse automaticamente UTF-8 e non ero disposto / in grado di infliggere agli utenti dei file istruzioni complicate su come aprirli. Quindi li ho codificati come UTF-16le (con una distinta componenti) anziché UTF-8. Due volte la dimensione, ma Excel è in grado di riconoscere la codifica. E si comprimono bene, quindi le dimensioni raramente (ma purtroppo non mai) contano.


È una vecchia domanda, ma sono felice che la gente risponda ancora. Grazie. :)
Lyubomyr Shaydariv il

1
@LyubomyrShaydariv: da quando ho risposto a questa domanda, un collega mi ha detto che l'ultimo Excel identifica i file CSV UTF-8 purché abbiano una DBA iniziale. Quindi tra qualche anno, quando tutti nel mondo (o comunque tutti i file a cui consegniamo i file) sono su quella versione di Excel o superiore, potrei essere in grado di cambiare la mia codifica :-)
Steve Jessop

Strano, per me non funziona. Trasforma i personaggi in simboli cinesi ... (dovrebbero essere
ebraici

Avevo caratteri cinesi in Excel quando ho salvato in "UTF-16 BE with BOM". Quando ho provato "UTF-16 LE con BOM" ha funzionato! Ho usato Sublime Text per i test.
Henno,

12

Vecchia domanda ma diamine, la soluzione più semplice è:

  1. Apri CSV in Blocco note
  2. Salva con nome -> seleziona la codifica corretta
  3. Apri il nuovo file

1
Quale versione di Excel usi?
Lyubomyr Shaydariv,

1
Fantastico, semplicemente funziona e risolve il problema (almeno per me)
Auberon Vacher,

1
No, perché il problema è che Excel apre il file .csv come file CSV. Voglio dire, ho un processo in cui generi file CSV. All'utente sarebbe quindi richiesto solo di aprire i file. Qui è tenuto a fare di più.
Veverke,

2
@Veverke se generi file regolarmente, questa non è la soluzione migliore. Ma se è una tantum, questa risposta è perfetta. Funziona perché Notepad inserirà la distinta base all'inizio di un file UTF-8 o UTF-16.
Mark Ransom,

Funziona come un fascino. ((:
user2925795

10

Come ho pubblicato su http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html :

Dì allo sviluppatore del software incaricato di generare il CSV per correggerlo. Come soluzione rapida puoi usare gsed per inserire la DBA UTF-8 all'inizio della stringa:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

Questo comando inserisce la DBA UTF-4 se non presente. Pertanto è un comando idempotente. Ora dovresti essere in grado di fare doppio clic sul file e aprirlo in Excel.


Grazie risolto. Ho appena convertito il csv ';' separato in UTF-BOM in Notepad ++ e sapere excels lo apre correttamente.
Random Acquista

Esattamente quello che serviva! Ecco un puntatore a come implementarlo in PHP stackoverflow.com/questions/25686191/…
EFC

Questa è la soluzione alternativa per Excel che non è stato in grado di riconoscere utl chareacter nei file CSV. Quindi questa correzione per risolvere il problema di Excel.
cobp

Funzionava con la versione greca di Excel 2007, con separatori di virgola. Grazie.
NameOfTheRose,

Modificata la codifica in 'UTF-16le' in fs.createWriteStream (fileName, {codifica: 'UTF-16le'}) ed Excel ha aperto correttamente il file CSV
rahul shukla,

9

Puoi convertire il file .csv in UTF-8 con BOM tramite Notepad ++:

  1. Apri il file in Notepad ++ .
  2. Vai al menu EncodingConvert to UTF-8 .
  3. Vai al menu FileSave .
  4. Chiudi Notepad ++.
  5. Apri il file in Excel.

Ha funzionato in Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) a 64 bit da Microsoft Office Professional Plus 2013 su Windows 8.1 con impostazioni internazionali per i programmi non Unicode impostati su "Tedesco (Germania)".


1
Fatto quello che hai detto, non ha funzionato affatto. Conversione / codifica, impostazione di set di caratteri, niente ha funzionato nel mio caso. Importa file su fogli di Google, scarica come CSV, ha funzionato perfettamente. Il vostro benvenuto dal 2045
pakalbekim il

1
Ho dovuto convertirlo con la codifica -> Cinvert ti UTF-8-BOM Excel versione 2016
Igor Vuković

4

Macro vba semplice per l'apertura di file di testo uts-8 e CSV

Sub OpenTextFile()

   filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
   If filetoopen = Null Or filetoopen = Empty Then Exit Sub

   Workbooks.OpenText Filename:=filetoopen, _
   Origin:=65001, DataType:=xlDelimited, Comma:=True

End Sub

Origine: = 65001 è UTF-8. Virgola: vero per i file .csv distribuiti in colonne

Salvalo in Personal.xlsb per averlo sempre disponibile. Personalizza la barra degli strumenti di Excel aggiungendo un pulsante di chiamata macro e apri i file da lì. Puoi aggiungere altri formati alla macro, come ad esempio adattamento automatico colonna, allineamento, ecc.


2
Grazie. Sfortunatamente, questo è il suggerimento per gli utenti Excel davvero avanzati, e ciò a cui sto puntando, ponendo questa domanda, è fare in modo che Excel lo faccia automaticamente.
Lyubomyr Shaydariv

Ho provato a utilizzare questo frammento di codice ma non funziona per me. Uso Excel 2013.
Sharunas Bielskis

3

Solo per aiutare gli utenti interessati ad aprire il file su Excel che ottengono questo thread come me.

Ho usato la procedura guidata qui sotto e ha funzionato bene per me, importando un file UTF-8. Non trasparente, ma utile se hai già il file.

  1. Apri Microsoft Excel 2007.
  2. Fai clic sull'opzione della barra dei menu Dati.
  3. Fai clic sull'icona Da testo.
  4. Passare alla posizione del file che si desidera importare. Fare clic sul nome file e quindi fare clic sul pulsante Importa. La procedura guidata per l'importazione del testo - La finestra Step 1 o 3 ora apparirà sullo schermo.
  5. Scegli il tipo di file che meglio descrive i tuoi dati: larghezza delimitata o fissa.
  6. Scegli 65001: Unicode (UTF-8) dall'elenco a discesa che appare accanto a Origine file.
  7. Fare clic sul pulsante Avanti per visualizzare l'Importazione guidata testo - finestra Passaggio 2 o 3.
  8. Metti un segno di spunta accanto al delimitatore utilizzato nel file che desideri importare in Microsoft Excel 2007. La finestra di anteprima dei dati ti mostrerà come appariranno i tuoi dati in base al delimitatore che hai scelto.
  9. Fare clic sul pulsante Avanti per visualizzare l'Importazione guidata testo - Passaggio 3 di 3.
  10. Scegli il formato dati appropriato per ogni colonna di dati che desideri importare. Hai anche la possibilità di non importare una o più colonne di dati, se lo desideri.
  11. Fare clic sul pulsante Fine per completare l'importazione dei dati in Microsoft Excel 2007.

Fonte: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0


3

Sì, questo è possibile. Come precedentemente notato da più utenti, sembra esserci un problema con Excel che legge il corretto Byte Order Mark quando il file è codificato in UTF-8. Con UTF-16 non sembra avere un problema, quindi è endemico a UTF-8. La soluzione che uso per questo è l'aggiunta della DBA, DUE VOLTE. Per questo eseguo il seguente comando sed due volte:

sed -I '1s/^/\xef\xbb\xbf/' *.csv

, in cui il carattere jolly può essere sostituito con qualsiasi nome di file. Tuttavia, ciò porta a una mutazione di sep = all'inizio del file .csv. Il file .csv si aprirà quindi normalmente in Excel, ma con una riga aggiuntiva con "sep =" nella prima cella. "Sep =" può anche essere rimosso nel .csv di origine stesso, ma quando si apre il file con VBA è necessario specificare il delimitatore:

Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)

Il formato 6 è il formato .csv. Impostare Local su true, nel caso in cui vi siano date nel file. Se Local non è impostato su true, le date saranno americanizzate, il che in alcuni casi danneggerà il formato .csv.


1
quando eseguo il comando sed, ottengo: "sed: opzione non valida - 'I'", penso che dovrebbe essere 'i'
BiAiB

2

Questa è la mia soluzione di lavoro:

vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001

La chiave è Origine: = 65001


2

Sì, è possibile. Quando si scrive lo stream creando il CSV, la prima cosa da fare è questa:

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)

Non hai letto la domanda! Lyubomyr Shaydariv ha scritto: "Ho anche provato a specificare UTF-8 BOM EF BB BF, ma Excel lo ignora."
Elmue,

Questo è un codice funzionante. Se si scrivono file UTF-8 dalle applicazioni .Net con questo cavo, Excel riconoscerà il file come UTF8.
zax,

Potrebbe essere nel TUO Excel funziona. Ma almeno in Excel 2007 la DBA viene completamente ignorata. Quindi, se hai intenzione di scrivere un codice che funzioni su tutte le versioni di Excel, il tuo codice non è utile.
Elmue,

2

Un elenco di risposte davvero sorprendente, ma poiché ne manca ancora uno abbastanza buono, lo menzionerò qui: apri il file CSV con fogli di Google e salvalo sul tuo computer locale come file Excel.

A differenza di Microsoft, Google è riuscita a supportare i file csv UTF-8, quindi funziona solo per aprire il file lì. E anche l'esportazione in formato Excel funziona. Quindi, anche se questa potrebbe non essere la soluzione preferita per tutti, è abbastanza sicura e il numero di clic non è così elevato come potrebbe sembrare, soprattutto quando sei già connesso a Google comunque.


2

Questo non sta affrontando accuratamente la domanda, ma dal momento che mi sono imbattuto in questo e le soluzioni di cui sopra non hanno funzionato per me o avevo requisiti che non potevo soddisfare, ecco un altro modo per aggiungere la DBA quando si ha accesso a VIM:

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv

2

ciao sto usando ruby ​​on rails per la generazione di CSV. Nella nostra applicazione intendiamo scegliere il multi lingua (I18n) e abbiamo riscontrato un problema durante la visualizzazione del contenuto I18n nel file CSV di Windows Excel.

Andava bene con Linux (Ubuntu) e mac.

Abbiamo identificato che Windows Excel deve essere importato nuovamente i dati per visualizzare i dati effettivi. Durante l'importazione avremo più opzioni per scegliere il set di caratteri.

Ma questo non può essere educato per ogni singolo utente, quindi la soluzione che stiamo cercando è quella di aprire solo con un doppio clic.

Quindi abbiamo identificato il modo di mostrare i dati in modalità aperta e bom in Windows eccellere con l'aiuto di aghuddleston gist . Aggiunto a riferimento.

Esempio di contenuto I18n

In Mac e Linux

Svedese: Förnamn inglese: nome

In Windows

Svedese: Förnamn inglese: nome

def user_information_report(report_file_path, user_id)
    user = User.find(user_id)
    I18n.locale = user.current_lang
    open_mode = "w+:UTF-16LE:UTF-8"
    bom = "\xEF\xBB\xBF"
    body user, open_mode, bom
  end

def headers
    headers = [
        "ID", "SDN ID",
        I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
        I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
        I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_zip'),
        I18n.t('sys_phone_number')
    ]
  end

def body tenant, open_mode, bom
    File.open(report_file_path, open_mode) do |f|
      csv_file = CSV.generate(col_sep: "\t") do |csv|
        csv << headers
        tenant.patients.find_each(batch_size: 10) do |patient|
          csv <<  [
              patient.id, patient.patientid,
              patient.first_name, patient.last_name, "#{patient.dob}",
              "#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
              "#{patient.city}", "#{patient.state}",  "#{patient.zip}",
              "#{patient.phone_number}"
          ]
        end
      end
      f.write bom
      f.write(csv_file)
    end
  end

Le cose importanti da notare qui sono la modalità aperta e la bom

open_mode = "w +: UTF-16LE: UTF-8"

bom = "\ xEF \ xBB \ xBF"

Prima di scrivere il CSV inserire la DBA

f. scrivere bom

f.write (csv_file)

Windows e Mac

Il file può essere aperto direttamente facendo doppio clic.

Linux (ubuntu)

Quando apri un file chiedi le opzioni di separazione -> scegli "TAB" inserisci qui la descrizione dell'immagine


1

Ho riscontrato lo stesso problema qualche giorno fa e non sono riuscito a trovare alcuna soluzione perché non riesco a utilizzare import from csv funzione perché rende tutto in stile stringa.

La mia soluzione era di aprire prima il file con notpad ++ e change the encode to ASCII. Quindi ho appena aperto il file in Excel e ha funzionato come previsto.


1

In php hai appena anteposto $ bom al tuo $ csv_string:

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );

Testato con MS Excel 2016, php 7.2.4


0

Questa è una vecchia domanda ma ho appena riscontrato un problema simile e la soluzione potrebbe aiutare gli altri:

Aveva lo stesso problema in cui la scrittura di dati di testo CSV in un file, quindi l'apertura del risultante .csv in Excel sposta tutto il testo in una singola colonna. Dopo aver letto le risposte sopra ho provato quanto segue, che sembra risolvere il problema.

Applica una codifica di UTF-8 quando crei StreamWriter. Questo è tutto.

Esempio:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}

@elmue cura di elaborare un po '? Sicuramente l'output di CSV utilizzando la codifica corretta per cominciare garantisce che non ci siano problemi di compatibilità con Excel in seguito nel flusso di lavoro?
Rex

Il codice è errato perché non è necessario output.Close () se si dispone di un'istruzione using (). A parte questo Excel CSV inport è molto primitivo. Non lo userei affatto. Se vuoi importare in Excel usa invece una tabella HTML e aprila in Excel.
Elmue,

Grazie per aver chiarito @Elmue - sfortunatamente mi sono imbattuto in una serie di scenari (inclusi file su unità di rete) in cui è richiesta una chiusura esplicita oltre allo smaltimento. Non ho trovato un motivo per cui, credo, ricordo di aver visto una chiamata Close()nello Disposestack ma eccoci. Sei anche errato nella tua affermazione che l'importazione CSV è primitiva in quanto non richiede l'approccio HTML inefficiente che hai suggerito. In effetti, la creazione di ulteriori passaggi programmatici per acquisire dati in testo semplice, trasformarli in HTML, quindi estrarli in Excel sembra contro intuitivo
Rex

continua ... Tuttavia, diversi scenari hanno requisiti diversi e il mio esempio mostra correttamente come specificare la codifica come richiesto dall'OP
Rex

Leggi di nuovo la domanda originale: "Ho anche provato a specificare la BOM EF BB BF UTF-8, ma Excel lo ignora." Ho provato lo stesso e giungo allo stesso risultato: Excel NON riconosce la distinta base UTf8. Provalo! Scrivi un file CSV e inseriscici i caratteri greci o russi. Quindi aprilo in Excel e otterrai garbarge. Quindi la tua risposta non risolve nulla.
Elmue,

0

Se vuoi renderlo completamente automatico, un clic o caricare automaticamente in Excel da una pagina web, ma non puoi generare file Excel corretti, ti suggerisco di guardare il formato SYLK come alternativa. OK non è semplice come CSV ma è basato su testo e molto facile da implementare e supporta UTF-8 senza problemi.

Ho scritto una classe PHP che riceve i dati e genera un file SYLK che si aprirà direttamente in Excel semplicemente facendo clic sul file (o avvierà automaticamente Excel se si scrive il file in una pagina Web con il tipo MIME corretto. È anche possibile aggiungi la formattazione (come grassetto, formatta numeri in modi particolari, ecc.) e modifica le dimensioni delle colonne o le colonne delle dimensioni automatiche al testo nelle colonne e tutto sommato il codice probabilmente non è più di circa 100 righe.

È semplicissimo decodificare SYLK creando un semplice foglio di calcolo e salvandolo come SYLK e quindi leggendolo con un editor di testo. Il primo blocco sono le intestazioni e i formati numerici standard che riconoscerai (che rigurgiti in ogni file che crei), quindi i dati sono semplicemente una coordinata X / Y e un valore.


0
  1. Scarica e installa LibreOffice Calc
  2. Apri il file csv di tua scelta in LibreOffice Calc
  3. Grazie al cielo che appare una procedura guidata di importazione del testo ...
  4. ... seleziona il delimitatore e le opzioni di codifica dei caratteri
  5. Seleziona i dati risultanti in Calc e copia incolla in Excel

0

Sto generando file CSV da una semplice applicazione C # e ho avuto lo stesso problema. La mia soluzione era assicurarsi che il file fosse scritto con la codifica UTF8, in questo modo:

// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
    SaveCSV(writer);
}

Inizialmente avevo il seguente codice, con il quale gli accenti sembrano a posto in Notepad ++ ma sono stati alterati in Excel:

using (StreamWriter writer = new StreamWriter(path))
{
    SaveCSV(writer);
}

Il tuo chilometraggio può variare: sto usando .NET 4 ed Excel da Office 365.


0

Soluzione funzionante per Office 365

  • salva in UTF-16(no LE, BE)
  • usa il separatore \t

Codice in PHP

$header = ['číslo', 'vytvořeno', 'ěščřžýáíé'];
$fileName = 'excel365.csv';
$fp = fopen($fileName, 'w');
fputcsv($fp, $header, "\t");
fclose($fp);

$handle = fopen($fileName, "r");
$contents = fread($handle, filesize($fileName));
$contents = iconv('UTF-8', 'UTF-16', $contents);
fclose($handle);

$handle = fopen($fileName, "w");
fwrite($handle, $contents);
fclose($handle);

-1

Innanzitutto salva il foglio di calcolo Excel come testo Unicode. Apri il file TXT usando Internet Explorer e fai clic su "Salva come" Codifica TXT: scegli la codifica appropriata, ad esempio per Win Cyrillic 1251


-1

Ho provato tutto ciò che ho potuto trovare su questo thread e simili, niente ha funzionato completamente. Tuttavia, l'importazione su fogli di Google e il semplice download come CSV ha funzionato come un fascino. Provalo se vieni al mio punto di frustrazione.

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.