2011-07-05 00:01:28 +0000 2011-07-05 00:01:28 +0000
69
69

Come posso impostare Excel per importare sempre tutte le colonne dei file CSV come testo?

Anche se cerco di evitarlo, occasionalmente devo aprire un file CSV in Excel. Quando lo faccio, formatta le colonne contenenti numeri, il che le rende inutili per i miei scopi. Per quanto posso dire, l'unico modo per evitare che questo accada all'importazione è rinominare il file in modo che l'estensione non sia .csv e usare la procedura guidata di importazione per specificare il formato di ogni colonna individualmente. Per file con 50-60 colonne, questo è poco pratico.

Poiché ogni risposta a questa domanda spesso posta su internet suggerisce o qualche mezzo per riconvertire i numeri formattati una volta che il file è aperto (che non funzionerà per me - voglio risolvere il problema generale, non alcuni casi specifici) o selezionare manualmente il tipo di formato di ogni colonna (che non voglio fare), sto cercando un modo per impostare una preferenza globale o uno stile tale che tutte le colonne di tutti i file CSV aperti siano sempre formattate come testo. So anche di “blindare” i numeri con le virgolette, ma i file che ricevo non sono così e speravo di evitare di dover pre-elaborare i file in modo che Excel non li incasini.

C'è un modo per fare specificamente questo: Formattare sempre tutte le colonne nei file CSV aperti come testo, senza selezionare manualmente ogni colonna ogni volta durante l'importazione?

Sto usando Excel 2003, ma accetto risposte per il 2007 se è quello che conosci.

Risposte (9)

73
73
73
2013-01-04 01:38:39 +0000

Come aprire CSV in Excel

Good way

  • Excel → Data → Get external data → Seleziona tutte le colonne con Shift e scegli Text

Bad way

  • Apri un CSV con Double Click o la finestra di dialogo Open with di Excel

Good way (per VBA)

Bad way (per VBA)

Altri metodi

  • Se hai accesso al sorgente che crea il tuo CSV, è possibile modificare la sintassi del CSV.
    Chiudi ogni valore con le doppie virgolette e aggiungi un segno di uguale come ="00001" o anteponi una tabulazione ad ogni valore. Entrambi i modi costringeranno Excel a trattare il valore come testo

  • Apri il CSV in Notepad e copia&incolla tutti i valori in Excel. Poi usa Data - Text to Columns Downside: Text in Columns per cambiare il formato delle colonne da generale a testo produce risultati inconsistenti. Se un valore contiene uno - circondato da caratteri (per esempio “=E1-S1”), Excel cerca di dividere quel valore in più di una colonna. I valori situati a destra di quella cella possono essere sovrascritti (Il comportamento di Text to columns è stato cambiato da qualche parte tra Excel 2007 e 2013, quindi non funziona più)


Excel Add-In per aprire CSV e importare tutti i valori come testo

Questo è un Excel Plug-in per semplificare le azioni di importazione CSV.
Il vantaggio principale: è una soluzione con un solo clic e usa lo stesso metodo a prova di bomba dietro Get external data

  • Aggiunge un nuovo comando di menu a Excel che permette di importare file CSV e TXT. Tutti i valori sono importati nel foglio attivo a partire dalla cella attualmente selezionata
  • Excel Add-in è disponibile per tutte le versioni di Office su Windows e Mac
  • L'intero Add-In ha solo 35 righe di codice. Controlla il codice sorgente commentato se sei curioso
  • Il separatore di lista CSV usato (virgola o punto e virgola) è preso dalle impostazioni locali di Excel
  • La codifica è impostata su UTF-8

Installazione

  1. Scarica l’ Add-In e salvalo nella tua cartella Add-Ins: QueryTables
  2. Aprire Excel e attivare l'Add-In: %appdata%\Microsoft\AddIns e selezionare File tab → Options → Add-Ins → Go To
  3. Abilitare le macro VBA: ImportCSV.xla
  4. Riavvia Excel

Noterai una nuova voce nella barra dei menu chiamata Add-Ins e userai questo pulsante per aprire rapidamente i tuoi file CSV senza passare attraverso il fastidio della finestra di dialogo di importazione


Script PowerShell per aprire CSV direttamente da Windows Explorer

Puoi usare uno script PowerShell per aprire file CSV e passarli automaticamente a Excel. Lo script utilizza silenziosamente il metodo di importazione del testo di Excel che tratta i valori sempre come testo e, come bonus, gestisce la codifica UTF-8

  1. Create un nuovo file di testo e incollate lo script sottostante. Una versione commentata può essere trovata qui
$CSVs = @()
$args.ForEach({
    If ((Test-Path $_) -and ($_ -Match "\.csv$|\.txt$")) {
        $CSVs += ,$_
    } 
})

if (-Not $null -eq $CSVs) {

    $excel = New-Object -ComObject excel.application 
    $excel.visible = $true
    $excel.SheetsInNewWorkbook = $CSVs.Count    
    $workbook = $excel.Workbooks.Add()

    for ($i=0; $i -lt $CSVs.Count; $i++){

        $csv = Get-Item $CSVs[$i]
        $worksheet = $workbook.worksheets.Item($i + 1)
        $worksheet.Name = $csv.basename

        $TxtConnector = ("TEXT;" + $csv.fullname)
        $Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
        $query = $worksheet.QueryTables.item($Connector.name)
        $query.TextFilePlatform = 65001
        $query.TextFileTextQualifier = 1
        $query.TextFileOtherDelimiter = $Excel.Application.International(5) 
        $query.TextFileParseType = 1
        $arrFormats = ,2 * $worksheet.Cells.Columns.Count
        $query.TextFileColumnDataTypes = $arrFormats
        $query.AdjustColumnWidth = 1
        $query.Refresh()
        $query.Delete()
    }
}
  1. Salvatelo da qualche parte come File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros. (Nota l'estensione C:\my\folder\myScript.ps1)
  2. Apri la tua cartella sendto tramite WinR “ .ps1 ” Inserisci
  3. Crea una nuova scorciatoia con il tasto destro del mouse “ Nuovo ” Scorciatoia e incolla questa linea. Non dimenticate di cambiare il percorso con il vostro dove avete messo il vostro script. Date un nome al collegamento, per esempio, Excel

“%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe ” -NoProfile -NonInteractive -WindowStyle Hidden -File “C:\my\folder\myScript.ps1”

Ora potete selezionare (più) CSV e aprirli in Excel tramite shell:sendto

7
7
7
2011-07-06 19:13:20 +0000

Questo funziona:

Sub OpenCsvAsText(ByVal strFilepath As String)

    Dim intFileNo As Integer
    Dim iCol As Long
    Dim nCol As Long
    Dim strLine As String
    Dim varColumnFormat As Variant
    Dim varTemp As Variant

    '// Read first line of file to figure out how many columns there are
    intFileNo = FreeFile()
    Open strFilepath For Input As #intFileNo
    Line Input #intFileNo, strLine
    Close #intFileNo
    varTemp = Split(strLine, ",")
    nCol = UBound(varTemp) + 1

    '// Prepare description of column format
    ReDim varColumnFormat(0 To nCol - 1)
    For iCol = 1 To nCol
        varColumnFormat(iCol - 1) = Array(iCol, xlTextFormat)
        ' What's this? See VBA help for OpenText method (FieldInfo argument).
    Next iCol

    '// Open the file using the specified column formats
    Workbooks.OpenText _
            Filename:=strFilepath, _
            DataType:=xlDelimited, _
            ConsecutiveDelimiter:=False, Comma:=True, _
            FieldInfo:=varColumnFormat

End Sub

Uso:

OpenCsvAsText "C:\MyDir\MyFile.txt"

Il file separato da virgole è ora aperto come foglio Excel con tutte le colonne formattate come testo.

Notate che la soluzione guidata di @Wetmelon funziona bene, ma se state aprendo molti file allora potreste, come me, stancarvi di scorrere ogni volta fino alla colonna 60 per poter fare Shift-Click.

EDIT @GSerg afferma nel commento sottostante che questo “non funziona” e “mangia spazi e zeri iniziali”. Citerò solo il commento alla domanda, che è più descrittivo:

Per ragioni sconosciute, anche se si forniscono esplicitamente i formati per tutte le colonne in VBA, Excel lo ignorerà se l'estensione del file è CSV. Non appena cambiate l'estensione, quello stesso codice darà i risultati corretti.

Quindi il codice sopra “funziona”, ma viene ucciso da questo ridicolo comportamento di Excel. In qualsiasi modo lo si tagli, si è costretti a cambiare l'estensione in qualcosa di diverso da “.csv”, mi dispiace! Dopo di che, sei a casa libera.

4
4
4
2013-01-03 22:42:44 +0000

Il suggerimento di Wetmelon funziona (anche con .CSV) se fai come segue:

  1. Aprire Excel in una cartella di lavoro o foglio di lavoro vuoto
  2. Clicca su Dati > [Ottieni dati esterni] da testo
  3. Usa il “Wizard di importazione del testo” come descritto da Wetmelon (delimitato da virgole, seleziona la prima colonna, SHIFT+CLICK l'ultima colonna, imposta tutto su Testo).

So che sono più passaggi, ma almeno mi permette di aprire i CSV in questo modo senza dover cambiare l'estensione

2
2
2
2015-12-02 14:21:59 +0000

Attenzione!

Quando si usa il metodo manuale “Excel → Dati → Ottieni dati esterni → Seleziona tutte le colonne e scegli Testo”……

Questo imposterà solo le colonne di testo “che hanno dati nella prima riga” (tipicamente una riga di intestazione). Questa procedura guidata non mostra le colonne più a destra che potrebbero avere dati più in basso ma non nella prima riga. Per esempio:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

Non vedrete mai la colonna 4 nella procedura guidata di importazione, quindi non avrete l'opzione di cambiarla da formato generale a testo prima dell'importazione!!!!

1
1
1
2015-12-04 09:21:54 +0000

Ecco la procedura alternativa al codice postato sopra da Jean-François Corbett

Questa procedura importerà il file csv in Excel con tutte le colonne formattate come Testo

Public Sub ImportCSVAsText()
    Dim TempWorkbook As Workbook
    Dim TempWorksheet As Worksheet
    Dim ColumnCount As Integer
    Dim FileName As Variant
    Dim ColumnArray() As Integer

    'Get the file name
    FileName = Application.GetOpenFilename(FileFilter:="All Files (*.*),*.*", FilterIndex:=1, Title:="Select the CSV file", MultiSelect:=False)

    If FileName = False Then Exit Sub

    Application.ScreenUpdating = False

    'Open the file temporarily to get the count of columns
    Set TempWorkbook = Workbooks.Open(FileName)
    ColumnCount = TempWorkbook.Sheets(1).Range("A1").SpecialCells(xlCellTypeLastCell).Column
    TempWorkbook.Close SaveChanges:=False

    'Resize the array to number of columns
    ReDim ColumnArray(1 To ColumnCount)

    For i = 1 To ColumnCount
        ColumnArray(i) = xlTextFormat
    Next i

    Set TempWorkbook = Workbooks.Add
    Set TempWorksheet = TempWorkbook.Sheets(1)

    Application.DisplayAlerts = False
    TempWorkbook.Sheets(2).Delete
    TempWorkbook.Sheets(2).Delete
    Application.DisplayAlerts = True

    With TempWorksheet.QueryTables.Add("TEXT;" & FileName, TempWorksheet.Cells(1, 1))
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1251
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = ColumnArray
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

End Sub
0
0
0
2011-07-05 01:20:26 +0000

Se stai importando sempre gli stessi dati (formato record costante, layout, ecc…) potresti scrivere una macro di Access usando una specifica di importazione e poi scaricare i dati in Excel. Fatto questo può volte. L'altro modo in cui l'ho fatto è usare VBA e leggere i dati nel foglio di lavoro un record alla volta e analizzarli mentre li legge. Per quanto ne so non c'è modo di impostare un formato predefinito durante l'importazione in Excel e anche se si potesse, causerebbe problemi con il prossimo tipo di file che si cerca di analizzare.

0
0
0
2011-07-05 17:29:47 +0000

Come richiesta, presentando il mio commento come risposta (con un po’ più di informazioni aggiunte):

Hey Scripting Guy ha fatto un articolo sul blog su Importare CSV in Excel che potrebbe avere alcune chicche utili per te. Giocare con l'oggetto dati all'interno di powershell potrebbe permetterti di fare ciò che vuoi.

Anche se l'articolo menziona specificamente solo l'importazione dei dati nelle celle, il che potrebbe lasciare il formato numerico, potrebbe essere possibile giocare con alcune delle proprietà e dei metodi di Excel ComObject per forzare i dati a entrare nelle celle come testo grezzo (o forzare la formattazione delle celle in testo prima o dopo l'importazione).

0
0
0
2011-07-06 19:45:53 +0000

Per ragioni sconosciute, anche se si forniscono esplicitamente i formati per tutte le colonne, Excel li ignorerà se l'estensione del file è CSV.

Alcune opzioni:

  • Creare una query per importare i dati, come Wetmelon suggerisce .
    Svantaggio: potrebbero mancare i driver del database CSV su una macchina a 64 bit.

  • Usa il codice di Jean , ma incorpora la copia del file in una cartella temporanea e cambia l'estensione della copia.
    Svantaggio: Nessun collegamento al file originale (il salvataggio sovrascriverà la copia); dovrai cancellare manualmente la copia dopo. Tuttavia, è possibile salvare manualmente Save As sopra il CSV originale.

  • Aprire il CSV in Blocco note, Ctrl+A, Ctrl+C, incollare in Excel, poi Dati - Testo a colonne, poi c'è la solita procedura guidata dove puoi impostare tutte le colonne a Testo in una volta sola. È un sapore diverso dall'opzione precedente, perché nasconde anche la preziosa estensione da Excel.
    Svantaggio: manuale.

  • Avere un ciclo VBA molto semplice che legge tutto il file in memoria e lo mette sul foglio, cella per cella.
    Svantaggio: più lento, brutto.

-2
-2
-2
2013-03-12 21:37:27 +0000

Se ho capito bene la domanda, questo si risolve facilmente usando l'opzione Transpose in Paste-Special come descritto qui .