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

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 raggiunge i risultati attesi che mostrano qualcosa come Г„/Г¤, Г–/Г¶ . E non so come forzare Excel a capire che il file CSV aperto è codificato in UTF-8. Ho anche provato a specificare UTF-8 BOM EF BB BF , ma Excel lo ignora.

C’è qualche soluzione?

PS Quali strumenti potrebbero comportarsi come fa Excel?


AGGIORNARE

Devo dire che ho confuso la comunità con la formulazione della domanda. Quando stavo facendo 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 chiedendo di farlo automaticamente . Questo è molto confuso e si scontra con l’automazione macro VBA. Ci sono due risposte a queste domande che apprezzo di più: la prima risposta di Alex https://stackoverflow.com/a/6002338/166589 , e ho accettato questa risposta; e il secondo da Mark https://stackoverflow.com/a/6488070/166589 che è apparso un po ‘più tardi. Dal punto di vista dell’usabilità, Excel sembrava mancare di un buon supporto CSV UTF-8 di facile utilizzo, quindi ritengo che entrambe le risposte siano corrette e ho accettato la risposta di Alex prima perché in realtà affermava che Excel non era in grado di farlo questo in modo trasparente. Questo è ciò che ho confuso automaticamente qui. La risposta di Mark promuove un modo più complicato per gli utenti più esperti di ottenere il risultato previsto. Entrambe le risposte sono grandiose, ma quella di Alex si adatta alla mia domanda non chiaramente specificata un po ‘meglio.


AGGIORNAMENTO 2

Cinque mesi dopo l’ultima modifica, ho notato che la risposta di Alex è scomparsa per qualche motivo. Spero davvero che non si tratti di un problema tecnico e spero che non ci sia più discussione su quale sia la risposta più ampia ora. Quindi accetto la risposta di Mark come la migliore.

Alex è corretto, ma dato che devi esportare in csv, puoi dare agli utenti questo consiglio quando apri 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 di “csv” e cerca il tuo file
  5. Nella procedura guidata di importazione cambia File_Origin in “65001 UTF” (o scegli l’identificatore di carattere della lingua corretto)
  6. Cambia il delimitatore in virgola
  7. Seleziona dove importare e finire

In questo modo i personaggi speciali dovrebbero mostrare correttamente.

Il marcatore dell’ordine byte UTF-8 indurrà Excel 2007+ al fatto che stai usando UTF-8. (Vedi questo post SO ).

Nel caso in cui qualcuno abbia gli stessi problemi che ho riscontrato, la class di codifica UTF8 di .NET non emette un indicatore di ordine dei byte anche se il suo costruttore è esplicitamente informato. È necessario utilizzare questa soluzione alternativa se si desidera salvarlo con un indicatore di ordine dei byte.

Il bug con BOM ignorato sembra essere risolto per Excel 2013. Ho avuto lo stesso problema con le lettere in cirillico, ma l’aggiunta del carattere BOM \uFEFF ha aiutato.

È 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 problemi per un utente, …”

La risposta contrassegnata come risposta accettata con oltre 200 voti positivi è inutile per me perché non voglio dare 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 windows di configurazione differenti. 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 è ansible se si utilizzano file CSV perché la distinta base UTF8 viene ignorata e verranno visualizzati solo elementi inutili. 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 BOM in caratteri inutili 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 in modo così stupido da Microsoft che dipende dalle impostazioni della regione nel pannello di controllo se la virgola o il punto e virgola viene utilizzato come separatore. Quindi lo stesso file CSV potrebbe aprirsi correttamente su un computer ma su un altro computer no. “CSV” significa “valori separati da virgola ” ma, ad esempio, su un tedesco Windows, per impostazione predefinita, il punto e virgola deve essere utilizzato come separatore, mentre la virgola non funziona. (Qui dovrebbe essere denominato SSV = Punti separati da punto e virgola) I file CSV non possono essere scambiati tra diverse versioni linguistiche di Windows. Questo è un problema aggiuntivo al problema UTF-8.

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

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 ottiene il risultato corretto.

Contenuto del file XLS UTF8:

 
Colum1Column2
Val1Val2
АвиабилетTλληνικ

Risultato in Excel 2007:

UTF8 HTML Excel

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

  
Colum1Column2
Val1Val2
АвиабилетTλληνικ

Risultato in Excel 2007:

UTF8 HTML Excel

In questo caso, solo il tavolo stesso ha un bordo e linee nere. Se vuoi che TUTTE le celle visualizzino le linee della griglia, questo è anche ansible in HTML:

        MySuperSheet          
Colum1Column2
Val1Val2
АвиабилетTλληνικ

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

Risultato in Excel 2007:

inserisci la descrizione dell'immagine qui

Abbiamo utilizzato questa soluzione alternativa:

  1. Converti CSV in UTF-16
  2. Inserisci BOM all’inizio del file
  3. Usa tab come separatore di campo

Ho avuto gli stessi problemi con i file CSV generati da PHP. Excel ha ignorato il BOM quando il Separatore è stato definito tramite "sep=,\n" all’inizio del contenuto (ma ovviamente dopo il DB).

Quindi aggiungendo una distinta base ( "\xEF\xBB\xBF" ) all’inizio del contenuto e impostando il punto e virgola come separatore tramite fputcsv($fh, $data_array, ";"); fa il trucco

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

Non sono riuscito a trovare alcun modo per far riconoscere automaticamente a UTF-8 Excel, e non ero disposto / in grado di infliggere ai consumatori dei file istruzioni complicate su come aprirli. Quindi li ho codificati come UTF-16le (con una distinta base) anziché UTF-8. Due volte la dimensione, ma Excel può riconoscere la codifica. E si comprimono bene, quindi le dimensioni raramente (ma purtroppo non mai) sono importanti.

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

  1. Apri CSV nel blocco note
  2. Salva come -> seleziona la codifica corretta
  3. Apri il nuovo file

Come ho postato su http://thinkinginsoftware.blogspot.com/2017/12/correttamente-generato-csv-che-excel-can.html :

Informare lo sviluppatore del software incaricato di generare il CSV per correggerlo. Come soluzione rapida, puoi usare gsed per inserire il BOM UTF-8 all’inizio della stringa:

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

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

Questa è una vecchia domanda ma viene visualizzata nella ricerca in alto. Ho trovato dopo un sacco di sforzi che l’aggiunta di caratteri BOM all’inizio del file CSV aiuta.

L’ho informato qui: https://sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-excel-import—ha

Macro vba semplice per l’apertura di file di testo e csv utf-8

 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 nelle 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ì. È ansible aggiungere più formattazione alla macro, come autofit della colonna, allineamento, ecc.

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

Ho usato il wizard 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. Fare clic sull’opzione della barra dei menu Dati.
  3. Fare clic sull’icona Da testo.
  4. Passare alla posizione del file che si desidera importare. Fare clic sul nome del file e quindi fare clic sul pulsante Importa. Importazione guidata testo: la finestra Passaggio 1 o 3 verrà ora visualizzata sullo schermo.
  5. Scegli il tipo di file che meglio descrive i tuoi dati – Delimited o Fixed Width.
  6. Scegliere 65001: Unicode (UTF-8) dall’elenco a discesa visualizzato accanto all’origine del file.
  7. Fare clic sul pulsante Avanti per visualizzare l’Importazione guidata testo – Finestra Passaggio 2 o 3.
  8. Posiziona 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 i tuoi dati verranno visualizzati in base al delimitatore 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

Un elenco davvero sorprendente di risposte, ma dal momento che ne manca ancora uno piuttosto buono, lo menzionerò qui: apri il file csv con i fogli di google e salvalo sul tuo computer locale come file Excel.

A differenza di Microsoft, Google è riuscito a supportare i file csv UTF-8 in modo che funzioni solo per aprire il file lì. E anche il formato di esportazione in formato Excel funziona. Pertanto, anche se questa potrebbe non essere la soluzione preferita per tutti, è abbastanza sicura e il numero di clic non è alto come potrebbe sembrare, specialmente quando hai già effettuato l’accesso a google.

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

Sì, è ansible. Quando scrivi lo stream che crea il csv, la prima cosa da fare è questa:

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

Sì, questo è ansible. Come notato in precedenza da più utenti, sembra esserci un problema con Excel che legge il corretto ordine byte 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 distinta base, DUE VOLTE. Per questo eseguo il seguente comando sed due volte:

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

, dove il carattere jolly può essere sostituito con qualsiasi nome di file. Tuttavia, questo porta a una mutazione del sep = all’inizio del file .csv. Il file .csv si aprirà normalmente in Excel, ma con una riga in più con “sep =” nella prima cella. Il “sep =” può anche essere rimosso nella sorgente .csv stesso, ma quando si apre il file con VBA si dovrebbe specificare il delimitatore:

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

Il formato 6 è il formato .csv. Imposta Local su true, nel caso ci siano date nel file. Se Local non è impostato su true, le date saranno americanizzate, il che in alcuni casi corromperà il formato .csv.

Questo non sta affrontando con precisione la domanda ma poiché mi sono imbattuto in questo e le soluzioni di cui sopra non hanno funzionato per me o avevano requisiti che non potevo incontrare, ecco un altro modo per aggiungere il BOM quando si ha accesso a vim:

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

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

Lo stesso problema riguardava la scrittura di dati di testo CSV in un file, quindi l’apertura di .csv risultante in Excel sposta tutto il testo in una singola colonna. Dopo aver letto le risposte di cui sopra ho provato il seguente, 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(); } 

Se vuoi renderlo completamente automatico, con un clic, o per caricare automaticamente in Excel da una pagina Web, ma non puoi generare file Excel appropriati, 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 class PHP che riceve i dati ed emette 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. aggiungi la formattazione (come grassetto, formatta i numeri in particolari modi, ecc.) e modifica le dimensioni delle colonne o le colonne di dimensioni automatiche del testo nelle colonne e tutto il codice non è probabilmente superiore a circa 100 righe.

È praticamente imansible eseguire il reverse engineering di SYLK creando un semplice foglio di calcolo e salvando come SYLK e quindi leggendolo con un editor di testo. Il primo blocco è costituito da intestazioni e formati numerici standard che è ansible riconoscere (che si rigurgitano in ogni file creato), quindi i dati sono semplicemente una coordinata X / Y e un valore.

  1. Scarica e installa LibreOffice Calc
  2. Apri il file csv di tua scelta in LibreOffice Calc
  3. Grazie al cielo, si presenta una procedura guidata per l’importazione di testo …
  4. … seleziona il tuo delimitatore e le opzioni di codifica dei caratteri
  5. Seleziona i dati risultanti in Calc e copia incolla su Excel

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

Originariamente avevo il seguente codice, con il quale gli accenti sono a posto in Notepad ++, ma sono stati rimossi in Excel:

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

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

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

Stava bene con Linux (Ubuntu) e Mac.

Abbiamo identificato che Windows Excel deve essere nuovamente importato per visualizzare i dati effettivi. Durante l’importazione otterremo 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 semplicemente con un doppio clic.

Quindi abbiamo identificato il modo di mostrare i dati in modalità aperta e bom in windows excel con l’aiuto di aghuddleston gist . Aggiunto al riferimento.

Esempio di contenuto I18n

In Mac e Linux

Svedese: Förnamn inglese: nome

In Windows

Svedese: Förnnn 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 open mode e bom

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

bom = "\ xEF \ xBB \ xBF"

Prima di scrivere il CSV, inserisci BOM

f.write bom

f.write (csv_file)

Windows e Mac

Il file può essere aperto direttamente facendo doppio clic.

Linux (ubuntu)

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

Per prima cosa salva il foglio di calcolo di Excel come testo Unicode. Apri il file TXT utilizzando Internet Explorer e fai clic su “Salva come” Codifica TXT – scegli la codifica appropriata, ad es. Per Win Cyrillic 1251