Come posso impedire ad Excel di mangiare i miei deliziosi file CSV e di eliminare dati inutili?


128

Ho un database che tiene traccia delle vendite dei widget per numero di serie. Gli utenti inseriscono i dati e la quantità dell'acquirente e scansionano ogni widget in un programma client personalizzato. Quindi finalizzano l'ordine. Tutto funziona perfettamente.

Alcuni clienti desiderano un foglio di calcolo compatibile con Excel dei widget che hanno acquistato. Generiamo questo con uno script PHP che interroga il database e genera il risultato come CSV con il nome del negozio e i dati associati. Anche questo funziona perfettamente.

Se aperto in un editor di testo come Blocco note o vi, il file è simile al seguente:

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

Come puoi vedere, i numeri di serie sono presenti (in questo caso due volte, non tutti i numeri di serie secondari sono uguali) e sono lunghe stringhe di numeri. Quando questo file viene aperto in Excel, il risultato diventa:

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

Come avrai notato, i numeri di serie sono racchiusi tra virgolette doppie. Excel non sembra rispettare i qualificatori di testo nei file .csv. Quando si importano questi file in Access, non abbiamo difficoltà. Quando li apri come testo, nessun problema. Ma Excel, a colpo sicuro, converte questi file in immondizia inutile. Cercare di istruire gli utenti finali sull'arte di aprire un file CSV con un'applicazione non predefinita sta diventando, diciamo, noioso. C'è speranza? C'è un'impostazione che non sono riuscito a trovare? Questo sembra essere il caso di Excel 2003, 2007 e 2010.


46
posso dare un +1 solo per il nome?
tombull89,

11
Excel does not seem to respect text qualifiers in .csv files- le doppie virgolette non sono qualificatori di testo, semplicemente consentono virgole nei tuoi dati, se non usi virgole nei tuoi dati allora sono prive di significato . Tutti i dati in un file CSV non sono tipizzati, quindi Excel può solo indovinare che il tuo numero seriale di grandi dimensioni è un numero , e questo è quando corri alla precisione massima di Excel di 15 cifre, che è ciò che sta troncando i tuoi numeri.
DMA57361

1
Excel non sembra rispettare tutte le virgole tra virgolette doppie. Considera "Excel del 12 agosto 2012" che trasforma anche questo in immondizia.
zundarz,

5
Voglio menzionare questa domanda SU . Spiega quali opzioni hai quando hai a che fare con CSV in Excel.
nixda,

1
@nixda Grazie! Questi sono suggerimenti utili, soprattutto per gli utenti più esperti. Il mio problema è quasi più un problema umano, in quanto Excel si associa ai file .csv e le persone vedono l'icona e fanno doppio clic (perché è così che apri le cose), e quindi di solito premono Salva (perché diciamo sempre loro per salvare!), e tutto è perduto. Ma userò sicuramente i tuoi metodi quando possibile.
atroon

Risposte:


58

Ma Excel, a colpo sicuro, converte questi file in immondizia inutile.

Excel è immondizia inutile.

Soluzione

Sarei un po 'sorpreso se qualsiasi client che desiderasse i tuoi dati in un formato Excel non fosse in grado di modificare la formattazione visibile su quelle tre colonne in "Numero" con zero decimali o in "testo". Ma supponiamo che un breve documento di istruzioni sia fuori discussione.

Le tue opzioni sono:

  1. Inserisci un carattere non numerico, non di spazi bianchi nei tuoi numeri di serie.
  2. Scrivi un file xls o xlsx con una formattazione predefinita.
  3. Trucchi e output di questi numeri come formule ="268435459705526269","",="268435459705526269"(puoi anche ="268435459705526269",,="268435459705526269"salvare 2 caratteri). Questo ha il vantaggio di essere visualizzato correttamente, e probabilmente di essere generalmente utile, ma sottilmente rotto (in quanto sono formule).

Fai attenzione con l'opzione 3, perché alcuni programmi (inclusi Excel e Open Office Calc) non tratteranno più le virgole all'interno dei =""campi come fuggiti. Ciò significa che ="abc,xyz"si estenderà su due colonne e interromperà l'importazione.

L'uso del formato "=""abc,xy"""risolve questo problema, ma questo metodo ti limita ancora a 255 caratteri a causa del limite di lunghezza della formula di Excel.


1
In realtà, non è duro. Copia e incolla uno dei numeri sopra in Excel, quindi modifica il formato dei numeri come suggerito. Excel modifica il valore, causando immondizia.
Joe Internet,

1
@Joe, ero troppo superficiale nella mia panoramica iniziale. Excel sta effettivamente producendo spazzatura ed è essa stessa spazzatura. Ho aggiornato la mia risposta per riflettere ciò. Un'opzione potrebbe essere avere un "csv Excel" e anche un "csv utile e utile"
Tyler,

2
@Tyler - Non credo che Excel sia spazzatura, sto solo dicendo che OP ha ragione nel dire che stava producendo spazzatura in questo caso. In realtà è un'ottima domanda, senza una soluzione apparentemente elegante.
Joe Internet,

1
È stata suggerita l'opzione Formatta celle ... e ho provato a usarla. In questo caso, nel momento in cui apri il file, Excel sembra convertire i periodici in notazione scientifica (concordata, non inattesa) e lancia la precisione. Quando li si modifica in un numero o in testo, la stringa non ritorna. Questa è davvero l'essenza del problema. Presentare come formule può farlo però ... Non ci ho pensato.
atroon,

9
@ DMA57361 Il comportamento non è previsto, è determinabile. La precisione numerica è ben documentata, come Excel non legge CSV. La mancanza di avvertimento e il rifiuto silenzioso dei dati è assurdo. Il fatto che non si possa nemmeno dire a Excel come importare i dati è altrettanto assurdo. La negatività è necessaria ? No, ma l'onestà è la migliore politica ed è così che mi sento.
Tyler,

42

Abbiamo avuto un problema simile in cui avevamo file CSV con colonne contenenti intervalli come 3-5 ed Excel li avrebbe sempre convertiti in date, ad esempio 3-5 sarebbe 3 marzo, dopo di che il passaggio al valore numerico ci ha dato un numero intero di date inutile. Ci siamo aggirati

  1. Rinominare l'estensione CSV in TXT
  2. Quindi, quando l'abbiamo aperto in Excel, questo si avviava nella procedura guidata di importazione del testo
  3. Nel passaggio 3 di 3 nella procedura guidata abbiamo indicato che le colonne in questione erano di testo e venivano importate correttamente.

Potresti fare lo stesso qui, penso.

procedura guidata di importazione del testo

Saluti


2
+1 per essere il modo corretto di farlo. (edit: mi dispiace ha dovuto modificare un po 'per chiarire soluzione)
jay

2
Non è necessario rinominare il file. Basta usare la procedura guidata di importazione Maiusc-selezionare tutte le colonne e scegliere come testo.
nixda,

1
L'importazione guidata testo è la risposta. Tutte le altre soluzioni sono inutili hacker derivanti dal non capire come utilizzare Excel per visualizzare e modificare i CSV.
Eccellente il

1
@Excellll, facendolo certo un file alla volta. Quando si automatizza questo processo, la "pirateria informatica inutile" spesso salva la situazione.
Parrish Husband,

1
questo è completamente inutile quando Excel viene utilizzato dagli utenti standard per visualizzare i file CSV. prima di provare a spiegare come utilizzare la procedura guidata di importazione del testo per ~ 15 utenti di uffici per principianti, preferirei digitare il codice sorgente del documento Excel da solo.
Northkildonan,

8

La soluzione migliore è generare la cartella di lavoro XML. Come questo:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

Il file deve avere l'estensione .xml. Excel e OpenOffice lo aprono correttamente.


Vuoi dire che l'OP dovrebbe usare lo script PHP per convertire il database in formato XML?
Prasanna,

2
Molto più pulito di avere utenti che aprono .csv in Excel o rovinano il tuo CSV in modo che solo Excel possa capire il tuo CSV. Non è nemmeno quel complesso di uno schema.
binki,

Dove è documentato questo standard? Vorrei saperne di più sui tipi di dati disponibili.
John Doherty,

1

La mia soluzione: ho lo stesso problema con l'importazione dei numeri di serie. Non devono essere trattati come numeri, cioè non vengono eseguite funzioni matematiche su di esso, ma è necessario l'intero numero all'interno. La cosa più semplice che ho è inserire uno spazio nel numero seriale. ad es. "12345678 90123456 1234". Quando Excel lo importa, verrà trattato come testo anziché come un numero.


0

Avevo confuso i lunghi numeri di conto.

Ecco come l'ho risolto:

Apri il tuo file.csv in Libre Office / Open Office (potresti dover specificare delimitatori ecc.) Quindi salva il file come file XML Excel.

Quindi apri questo file in Excel e vedrai che le colonne non vengono più modificate in formato scientifico o altro. Per sicurezza fai clic con il pulsante destro del mouse sulla colonna e imposta esplicitamente il formato come Testo, quindi salva come formato di file Excel.

Apri il file in formato Excel e la colonna dovrebbe essere ancora ok!


1
Anche se questo potrebbe lavorare, cercando di spiegare a qualcuno che parla inglese rotto solo perché avrebbe bisogno di utilizzare una suite per ufficio diverso crea solo tanti problemi quanti ne risolva. Il software alternativo a M $ Office è tutto a mio avviso, ma mi rendo conto di non poter convertire tutti.
atroon,

0

L'importazione guidata è la soluzione migliore per utenti occasionali e situazioni una tantum. Se è necessaria una soluzione programmatica, è possibile utilizzare il metodo QueryTables.Add (che è ciò che viene utilizzato dall'Importazione guidata dietro le quinte).

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
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.