Wie kann ich Excel so einstellen, dass immer alle Spalten von CSV-Dateien als Text importiert werden?

68

Obwohl ich versuche, dies zu vermeiden, muss ich gelegentlich eine CSV-Datei in Excel öffnen. Wenn ich das tue, formatiert es Spalten, die Zahlen enthalten, was sie für meine Zwecke unbrauchbar macht. Soweit ich das beurteilen kann, besteht die einzige Möglichkeit, dies beim Import zu verhindern , darin, die Datei umzubenennen, sodass die Erweiterung nicht CSV lautet, und mithilfe des Importassistenten das Format jeder Spalte einzeln festzulegen. Bei Dateien mit 50-60 Spalten ist dies nicht praktikabel.

Da jede Antwort auf diese häufig gestellte Frage im Internet entweder eine Möglichkeit zum Zurückkonvertieren der formatierten Zahlen nach dem Öffnen der Datei vorsieht (was bei mir nicht funktioniert - ich möchte das allgemeine Problem lösen, nicht ein paar spezielle Fälle) Bei der manuellen Auswahl des Formattyps für jede Spalte (was ich nicht tun möchte) suche ich nach einer Möglichkeit, eine globale Voreinstellung oder einen globalen Stil so festzulegen, dass alle Spalten aller geöffneten CSV-Dateien immer als Text formatiert werden. Ich weiß, wie man die Zahlen auch mit Anführungszeichen "panzert", aber die Dateien, die ich bekomme, kommen nicht so und ich hatte gehofft, dass ich die Dateien nicht vorverarbeiten muss, damit Excel sie nicht vermasselt.

Gibt es eine Möglichkeit zu tun , speziell diese: Immer alle Spalten formatiert in geöffneten CSV - Dateien als Text, ohne manuell jeden Spalte jedes Mal beim Import der Auswahl?

Ich verwende Excel 2003, nehme aber Antworten für 2007, wenn Sie das wissen.

William Gunn
quelle
1
Hey Scripting Guy hat einen Blog-Artikel über das Importieren von CSV in Excel verfasst , der möglicherweise einige nützliche Details für Sie enthält. Wenn Sie mit dem Datenobjekt in Powershell spielen, können Sie möglicherweise tun, was Sie möchten. Nicht als Antwort gepostet, da es sich im Wesentlichen nur um einen externen Link handelt, der Ihnen jedoch möglicherweise von Nutzen sein könnte.
Matrix Mole

Antworten:

7

Das funktioniert:

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

Verwendungszweck:

OpenCsvAsText "C:\MyDir\MyFile.txt"

Kommagetrennte Datei ist jetzt als Excel-Tabelle geöffnet, wobei alle Spalten als Text formatiert sind.

Beachten Sie, dass die Assistentenlösung von @ Wetmelon einwandfrei funktioniert. Wenn Sie jedoch viele Dateien öffnen, werden Sie wie ich jedes Mal müde, wenn Sie zur Spalte 60 blättern, um sie mit gedrückter Umschalttaste anzuklicken.

EDIT @GSerg gibt im Kommentar unten an, dass dies "nicht funktioniert" und "Leerzeichen und führende Nullen frisst". Ich zitiere nur den Kommentar zu der Frage, der aussagekräftiger ist:

Aus unbekannten Gründen ignoriert Excel das Format, auch wenn Sie explizit Formate für alle Spalten in VBA angeben, wenn die Dateierweiterung CSV lautet. Sobald Sie die Erweiterung ändern, liefert derselbe Code die richtigen Ergebnisse.

Der obige Code "funktioniert" also, wird aber durch dieses lächerliche Excel-Verhalten getötet. Wie auch immer Sie es schneiden, Sie müssen die Erweiterung nicht mehr auf ".csv" ändern, sorry! Danach bist du frei zu Hause.

Jean-François Corbett
quelle
1
Funktioniert nicht Isst Leerzeichen, isst führende Nullen usw.
GSerg
1
Die angewandte Methode Workbooks.OpenTextweist konstruktionsbedingte Mängel auf (siehe meine Antwort unten). Verwenden Sie QueryTablesstattdessen.
Nixda
71

So öffnen Sie CSVs in Excel

Gute Möglichkeit

  • Excel → Daten → Externe Daten abrufen → Markieren Sie alle Spalten mit Shiftund wählen Sie Text

    Oben: Behandelt alle Werte ausnahmslos korrekt als Text

    Nachteil: Mehr Schritte als ein einfacher Doppelklick

Schlechter Weg

  • Öffnen Sie eine CSV-Datei mit einem Doppelklick oder im Excel- Dialogfeld Öffnen mit

    Nachteil: Der interne CSV-Handler von Excel interpretiert Werte mit einem Führungs- -oder =Vorzeichen als Formel und nicht als Text falsch

    Nachteil: Sie verlieren führende Nullen aus Binärwerten, wie dies 0001durch das automatisch erkannte Spaltenformat von Excel verursacht wird

Guter Weg (für VBA)

  • Verwenden Sie QueryTables (das Gegenstück zu VBA Get external data) → Beispielcode

    Oben: Behandelt alle Werte ausnahmslos korrekt als Text

    Nachteil: Etwas mehr Code als OpenTextMethode

Schlechter Weg (für VBA)

  • Verwenden Sie Workbooks.OpenTextMethode → Beispielcode

    Nachteil: Diese Methode verwendet immer noch den internen CSV-Import-Handler von Excel mit all seinen Fehlern

    Nachteil: Zusätzlich wird der fieldinfoParameter von OpenTextignoriert, wenn die Erweiterung CSV ist. Normalerweise können Sie mit diesem Parameter jedes Spaltenformat auswählen, jedoch nicht, wenn die Erweiterung CSV ist. Weitere Informationen zu diesem Verhalten finden Sie unter Stapelüberlauf

    Das vorübergehende Umbenennen der Quelldatei von CSV in TXT und dann wieder in CSV ist eine gültige Problemumgehung, wenn Sie die vollständige Kontrolle über die Quelldatei haben

Zusätzliche Methoden

  • Wenn Sie Zugriff auf die Quelle haben, die Ihre CSV erstellt, können Sie die CSV-Syntax ändern.
    Schließen Sie jeden Wert in doppelte Anführungszeichen ein und stellen Sie jedem Wert ein Gleichheitszeichen ="00001"voran. In beiden Fällen wird Excel gezwungen, den Wert als Text zu behandeln

    Ursprünglicher CSV-Inhalt
    Bildbeschreibung hier eingeben

    CSV in Excel beim Öffnen per Doppelklick
    Bildbeschreibung hier eingeben

    Beachten Sie, dass Zeile 2 (doppelte Anführungszeichenmethode) und Zeile 3 (Tabulatormethode) von Excel nicht geändert werden

  • Öffnen Sie CSV im Editor und kopieren Sie alle Werte in Excel. Verwenden Sie dann Daten - Text in Spalten
    unten: Text in Spalten, um die Spaltenformate von Allgemein zurück in Text zu ändern und inkonsistente Ergebnisse zu erzielen. Wenn ein Wert ein -von Zeichen umgebenes Zeichen enthält (z. B. "= E1-S1"), versucht Excel, diesen Wert in mehrere Spalten aufzuteilen. Werte, die sich direkt in dieser Zelle befinden, werden möglicherweise überschrieben.

    (Das Verhalten von Text in Spalten wurde zwischen Excel 2007 und 2013 geändert, sodass es nicht mehr funktioniert.)


Excel-Add-In zum Öffnen von CSVs und Importieren aller Werte als Text

Dies ist ein Excel-Plug-In zur Vereinfachung von CSV-Importaktionen.
Der Hauptvorteil: Es handelt sich um eine Ein-Klick-Lösung QueryTables, die dieselbe kugelsichere Methode wie beim Abrufen externer Daten verwendet

  • Es fügt Excel einen neuen Menübefehl hinzu, mit dem Sie CSV- und TXT-Dateien importieren können. Alle Werte werden ab der aktuell ausgewählten Zelle in das aktive Blatt importiert
  • Excel-Add-In ist für alle Office-Versionen unter Windows und Mac verfügbar
  • Das gesamte Add-In enthält nur 35 Codezeilen. Überprüfen Sie den kommentierten Quellcode, wenn Sie neugierig sind
  • Das verwendete CSV-Listentrennzeichen (Komma oder Semikolon) wird aus Ihren lokalen Excel-Einstellungen übernommen
  • Die Codierung ist auf UTF-8 eingestellt

Installation

  1. Laden Sie das Add-In herunter und speichern Sie es in Ihrem Add-Ins-Ordner:%appdata%\Microsoft\AddIns
  2. Öffnen Sie Excel und aktivieren Sie das Add-In: File tab → Options → Add-Ins → Go Tound wählen SieImportCSV.xla
  3. VBA-Makros aktivieren: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Starten Sie Excel neu

Sie werden einen neuen Menüleisteneintrag mit dem Namen Add-Ins bemerken, und mit dieser Schaltfläche können Sie Ihre CSV-Dateien schnell öffnen, ohne den Aufwand des Dialogfelds "Importieren" durchlaufen zu müssen

Bildbeschreibung hier eingeben


PowerShell-Skript zum Öffnen von CSVs direkt aus dem Windows Explorer

Mit einem PowerShell-Skript können Sie CSV-Dateien öffnen und automatisch an Excel übergeben. Das Skript verwendet im Hintergrund die Textimportmethode von Excel, die Werte immer als Text behandelt und als Bonus die UTF-8-Codierung verarbeitet

  1. Erstellen Sie eine neue Textdatei und fügen Sie das folgende Skript ein. Eine kommentierte Version finden Sie hier
$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. Speichern Sie es irgendwo wie C:\my\folder\myScript.ps1. (Beachten Sie die Erweiterung .ps1)
    • Öffnen Sie Ihren Sendeordner über WinR» shell:sendto» Enter
  2. Erstellen Sie eine neue Verknüpfung über Rechtsklick »Neu» Verknüpfung und fügen Sie diese Zeile ein. Vergessen Sie nicht, den Pfad zu Ihrem eigenen zu ändern, in dem Sie Ihr Skript abgelegt haben. Nennen Sie die Verknüpfung beispielsweise Excel

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

Jetzt können Sie (mehrere) CSVs auswählen und über in Excel öffnen Right-click » SendTo » Excel

Nixda
quelle
1
Das Add-In wurde mit Office 2003 und 2013
nixda
Der Top "Best Way" ist genau das, was ich für einen einmaligen Import brauchte. Sie müssen sich nicht mit VBA herumschlagen und können sogar steuern, welche Spalten als Datum / Zahlen verwendet werden (der Rest wird als Text verwendet). Ich wünschte, Excel würde anbieten, diesen Importassistenten zu öffnen, wenn ich auf CSV doppelklicke.
ADTC
@Vadzim Hallo, ich danke Ihnen für Ihre Bemühungen, tote Links zu reparieren. In der Tat macht ge.tt in den letzten Monaten einige Probleme. Aber ich denke, ich habe alle Probleme behoben und die alten Original-Links sollten wieder funktionieren. Ich weiß nicht, warum Google Chrome warnt, bevor Sie etwas von ge.tt herunterladen. Aber alle anderen Browser funktionieren normal und ich kann Ihnen versichern, dass sie keine Malware sind
Nixda
@ Nixda, danke für die Wiederbelebung der Links und für die tolle Antwort
Vadzim
@nixda Die Links zu ge.tt sind wieder defekt. Die meisten sagen, dass sie nicht verfügbar sind, weil der Eigentümer die AGB verletzt hat. In der Datei für OpenCSV.exe heißt es jedoch "Diese Dateien sind nicht mehr verfügbar, da sie gegen die Nutzungsbedingungen verstoßen." Was bringt mich zu der Frage, ob Sie der Autor der Funktion ImportMyCSV Excel sind? (Der Quellcode ist noch im Pastebin verfügbar.) Dies ist ein großartiges Tool - ich benutze es bei der Arbeit und habe es anderen empfohlen. Aber ich bin am Ursprung des Codes interessiert, nicht zuletzt, um den Autor richtig zu würdigen.
GlennFromIowa
5

Sie können es versuchen, indem Sie zuerst eine XLSX-Datei öffnen, dann eine Datenverbindung herstellen und die CSV-Datei importieren. Wählen Sie "Komma" als Trennzeichen und dann die Option, alle Spalten als Text anstatt als "Allgemein" zu behandeln.

Edit: Oh, ich habe die Frage nicht vollständig gelesen. Wählen Sie im Importassistenten die erste Spaltenüberschrift aus, die Sie als Text importieren möchten, navigieren Sie zur letzten Spaltenüberschrift und klicken Sie bei gedrückter Umschalttaste auf die Überschrift. Wählen Sie dann die radiale Option "Text".


quelle
2
Ja, das funktioniert gut - solange die Dateierweiterung nicht ".csv" ist. +1
Jean-François Corbett
4

Der Vorschlag von Wetmelon funktioniert (auch mit CSV), wenn Sie Folgendes tun:

  1. Öffnen Sie Excel in einer leeren Arbeitsmappe oder einem leeren Arbeitsblatt
  2. Klicken Sie auf Daten> [Externe Daten abrufen] aus Text
  3. Verwenden Sie den "Textimport-Assistenten", wie von Wetmelon beschrieben (durch Kommas getrennt, markieren Sie die erste Spalte, UMSCHALT + KLICKEN Sie die letzte Spalte, setzen Sie alles auf Text).

Ich weiß, dass es mehr Schritte sind, aber zumindest kann ich CSVs auf diese Weise öffnen, ohne die Erweiterung ändern zu müssen

Colorado Techie
quelle
2

Achtung!

Bei Verwendung der manuellen Methode "Excel → Daten → Externe Daten abrufen → Alle Spalten auswählen und Text auswählen" ......

Dadurch werden nur die Spalten auf "Text mit Daten in der ersten Zeile" gesetzt (normalerweise eine Kopfzeile). Dieser Assistent zeigt Ihnen nicht die Spalten weiter rechts an, in denen möglicherweise Daten weiter unten, jedoch nicht in der ersten Zeile enthalten sind. Zum Beispiel:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

Sie werden Col 4 nie im Import-Assistenten sehen, so dass Sie nicht die Möglichkeit haben, es vor dem Import vom allgemeinen in das Textformat zu ändern !!!!

PeterV
quelle
1
Eine gute Warnung: In 99,9999% der Fälle werden im Import-Assistenten keine Bildläufe ausgeführt, und selbst dann ist es schwierig, alle Spalten zu erfassen. Technisch gesehen können Sie jedoch im Importassistenten nach unten scrollen und zusätzliche Spalten abfangen, deren erste Zeile keine Daten enthält.
GlennFromIowa
1

Hier ist die alternative Vorgehensweise zu Code, der oben von Jean-François Corbett veröffentlicht wurde

Mit dieser Prozedur wird eine CSV-Datei mit allen als Text formatierten Spalten in Excel importiert

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
shivraj
quelle
Willkommen bei SuperUser, anstatt eine neue Antwort hinzuzufügen, sollten Sie die Antwort des Corbett bearbeitet und verbessert haben. Mir ist klar, dass Sie noch nicht genug Reputation haben, um dies zu tun, aber Sie könnten Ihre Änderungen in Kommentaren verknüpfen, wenn Sie ihn bitten, sie zu lesen.
Vlastimil Ovčáčík
0

Wenn Sie immer dieselben Daten importieren (konstantes Datensatzformat, Layout usw.), können Sie ein Access-Makro mithilfe einer Importspezifikation schreiben und die Daten dann wieder in Excel ausgeben. Fertig kann das mal sein. Die andere Möglichkeit besteht darin, VBA zu verwenden und die Daten einzeln in das Arbeitsblatt einzulesen und beim Lesen auszulesen. Soweit mir bekannt ist, gibt es keine Möglichkeit, beim Import in Excel ein Standardformat festzulegen, und selbst wenn dies möglich wäre, würde dies beim nächsten Dateityp, den Sie analysieren möchten, Probleme verursachen.

user88859
quelle
1
Hier ist die Sache - ich versuche nicht, ein Parsing durchzuführen, außer die Textzeichenfolge, die sich zwischen den Kommas befand, in Spalten zu setzen, wenn ich sie importiere. Wenn ich möchte, dass es auf eine bestimmte Weise formatiert wird, kann ich das tun (z. B. Datumsstrings erstellen usw.), aber ich brauche nur die Daten, die anfangs in Ruhe gelassen werden. Warum sollte das so schwer sein?
William Gunn
0

Als Aufforderung, meinen Kommentar als Antwort zu übermitteln (mit ein wenig mehr Info):

Hey Scripting Guy hat einen Blog-Artikel über das Importieren von CSV in Excel verfasst , der möglicherweise einige nützliche Details für Sie enthält. Wenn Sie mit dem Datenobjekt in Powershell spielen, können Sie möglicherweise tun, was Sie möchten.

Obwohl der Artikel speziell nur das Importieren der Daten in die Zellen erwähnt, die möglicherweise das Zahlenformat verlassen, ist es möglicherweise möglich, mit einigen der Excel ComObject-Eigenschaften und -Methoden zu spielen, um die Daten zu zwingen, stattdessen als Rohtext in die Zellen einzugeben (oder zu erzwingen) die Formatierung der Zellen in Text vor oder nach dem Import).

Matrix Mole
quelle
0

Auch wenn Sie explizit Formate für alle Spalten angeben, wird Excel aus unbekannten Gründen ignoriert, wenn die Dateierweiterung CSV lautet.

Einige Optionen:

  • Erstellen Sie eine Abfrage , um die Daten zu importieren, wie Wetmelon schlägt .
    Nachteil: Auf einem 64-Bit-Computer fehlen möglicherweise CSV-Datenbanktreiber.

  • Verwenden Sie den Code von Jean , kopieren Sie die Datei jedoch in einen temporären Ordner und ändern Sie die Erweiterung der Kopie.
    Nachteil: Keine Verknüpfung zur Originaldatei (Speichern überschreibt die Kopie); Sie müssen die Kopie anschließend manuell löschen. Sie können jedoch manuell über die ursprüngliche CSV-Datei als speichern.

  • Öffnen Sie die CSV in dem Editor Ctrl+A, Ctrl+C, fügen Sie in Excel, dann Daten - Text in Spalten, dann ist sie die üblichen Assistenten , wo Sie alle Spalten festlegen können in einem Rutsch Text. Es ist eine andere Variante der vorherigen Option, da es auch die wertvolle Erweiterung von Excel verbirgt.
    Nachteil: manuell.

  • Haben Sie eine sehr einfache VBA-Schleife, die die gesamte Datei in den Speicher liest und sie Zelle für Zelle auf das Blatt legt.
    Nachteil: langsamer, hässlich.

GSerg
quelle
Ist "Keine Verknüpfung zur ursprünglichen [CSV] -Datei" nicht ein Nachteil all dieser Methoden? Ich mag die Idee, in einen temporären Ordner zu kopieren und dort die Erweiterung zu ändern ... Könnte sogar das Original (als CSV) überschreiben, sobald die Kopie geöffnet ist.
Jean-François Corbett
@ Jean-FrançoisCorbett, ich verwende den Import-Assistenten ständig, um CSV-Dateien mit einer Erweiterung von CSV in Excel 2010 zu importieren. Das Format der Spalten wird explizit als Text angegeben und das Zellenformat als Text beibehalten. Vielleicht war dies ein Problem mit älteren Versionen von Excel?
GlennFromIowa
-2

Wenn ich die Frage richtig verstanden hat , ist dies leicht wie beschrieben mit der Transponierung Option in Paste-Spezial gelöst hier .

Rodger
quelle