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

Jak mogę ustawić program Excel, aby zawsze importował wszystkie kolumny z plików CSV jako tekst?

Chociaż staram się tego unikać, od czasu do czasu muszę otworzyć plik CSV w programie Excel. Kiedy to robię, formatuje on kolumny zawierające liczby, co czyni je bezużytecznymi dla moich celów. Z tego co wiem, jedynym sposobem, aby temu zapobiec przy imporcie jest zmiana nazwy pliku tak, aby rozszerzenie nie było .csv i użycie kreatora importu do określenia formatu każdej kolumny z osobna. Dla plików z 50-60 kolumnami jest to niepraktyczne.

Ponieważ każda odpowiedź na to często zadawane pytanie w Internecie sugeruje albo jakiś sposób konwersji sformatowanych liczb z powrotem po otwarciu pliku (co nie będzie działać dla mnie - chcę rozwiązać ogólny problem, a nie kilka konkretnych przypadków) lub ręczne wybieranie typu formatu każdej kolumny (czego nie chcę robić), szukam sposobu na ustawienie globalnych preferencji lub stylu, aby wszystkie kolumny wszystkich otwartych plików CSV były zawsze sformatowane jako tekst. Wiem też o “uzbrajaniu” liczb w cudzysłowy, ale pliki, które dostaję, nie przychodzą w ten sposób i miałem nadzieję uniknąć konieczności wstępnego przetwarzania plików, aby Excel ich nie spieprzył.

Czy istnieje sposób, aby zrobić specjalnie to: Zawsze formatuj wszystkie kolumny w otwartych plikach CSV jako tekst, bez ręcznego wybierania każdej kolumny za każdym razem podczas importu?

Używam Excela 2003, ale przyjmę odpowiedzi dla 2007, jeśli to jest to, co znasz.

Ответы (9)

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

Użyj metody QueryTables (odpowiednik VBA dla Get external data) → Przykładowy kod

Zły sposób (dla VBA)

Dodatkowe metody

  • Jeśli masz dostęp do źródła, które tworzy twoje CSV, możesz zmienić składnię CSV.
    Otocz każdą wartość podwójnym cudzysłowem i przedrostkiem znaku równości jak ="00001" lub przedrostkiem tabulacji do każdej wartości. Oba sposoby zmuszą Excela do traktowania wartości jako tekstu

  • Otwórz CSV w Notatniku i skopiuj&wklej wszystkie wartości do Excela. Następnie użyj Data - Text to Columns Minusy: Text in Columns do zmiany formatu kolumn z ogólnego z powrotem na tekstowy daje niespójne wyniki. Jeśli wartość zawiera znak - otoczony znakami (np. “=E1-S1”), Excel próbuje podzielić tę wartość na więcej niż jedną kolumnę. Wartości znajdujące się tuż przy tej komórce mogą zostać nadpisane (Zachowanie Text to columns zostało zmienione gdzieś między Excel 2007 a 2013, więc już nie działa)


Excel Add-In do otwierania CSV i importowania wszystkich wartości jako tekst

Jest to wtyczka do Excela, aby uprościć działania związane z importem CSV.
Główna zaleta: Jest to rozwiązanie za pomocą jednego kliknięcia i używa QueryTables, tej samej kuloodpornej metody za Get external data

  • Dodaje nowe polecenie menu do programu Excel, które pozwala importować pliki CSV i TXT. Wszystkie wartości są importowane do aktywnego arkusza począwszy od aktualnie wybranej komórki
  • Dodatki do Excela są dostępne dla wszystkich wersji Office na Windows i Mac
  • Cały Add-In ma tylko 35 linii kodu. Sprawdź skomentowany kod źródłowy jeśli jesteś ciekawy
  • Używany separator listy CSV (przecinek lub średnik) jest pobierany z lokalnych ustawień Excela
  • Kodowanie jest ustawione na UTF-8

Instalacja

  1. Pobierz Add-In i zapisz go w swoim folderze Add-Ins: %appdata%\Microsoft\AddIns
  2. Otwórz program Excel i aktywuj Add-In: File tab → Options → Add-Ins → Go To i wybierz ImportCSV.xla
  3. Włącz makra VBA: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Uruchom ponownie program Excel

Zauważysz nową pozycję na pasku menu o nazwie Add-Ins i użyjesz tego przycisku, aby szybko otworzyć pliki CSV bez przechodzenia przez kłopotliwe okno dialogowe Import


Skrypt PowerShell do otwierania plików CSV bezpośrednio z Eksploratora Windows

Możesz użyć skryptu PowerShell do otwierania plików CSV i automatycznego przekazywania ich do programu Excel. Skrypt po cichu wykorzystuje metodę importu tekstowego Excela, która traktuje wartości zawsze jako tekst, a jako bonus obsługuje kodowanie UTF-8

  1. Utwórz nowy plik tekstowy i wklej poniższy skrypt. Wersję z komentarzem można znaleźć tutaj
$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. Zapisz go gdzieś C:\my\folder\myScript.ps1. (Zwróć uwagę na rozszerzenie .ps1)
  2. Otwórz swój folder sendto przez WinR “ shell:sendto ” Enter
  3. Utwórz nowy skrót poprzez kliknięcie prawym przyciskiem myszy “ Nowy ” Skrót i wklej tę linię. Nie zapomnij zmienić ścieżki na swoją własną, gdzie umieściłeś swój skrypt. Nadaj nazwę skrótowi, na przykład Excel

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

Teraz możesz wybrać (wiele) CSV i otworzyć je w Excelu przez Right-click » SendTo » Excel

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

To działa:

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

Użycie:

OpenCsvAsText "C:\MyDir\MyFile.txt"

Plik rozdzielony przecinkami jest teraz otwarty jako arkusz Excela ze wszystkimi kolumnami sformatowanymi jako tekst.

Zauważ, że rozwiązanie kreatora @Wetmelon działa dobrze, ale jeśli otwierasz wiele plików, to możesz, tak jak ja, znużyć się przewijaniem za każdym razem do kolumny 60, aby kliknąć ją Shift-Click.

EDIT @GSerg stwierdza w komentarzu poniżej, że to “nie działa” i “zjada spacje i wiodące zera”. Po prostu zacytuję komentarz do pytania, który jest bardziej opisowy:

Z nieznanych powodów, nawet jeśli jawnie podasz formaty dla wszystkich kolumn w VBA, Excel zignoruje je, jeśli rozszerzenie pliku to CSV. Gdy tylko zmienisz rozszerzenie, ten sam kod da poprawne wyniki.

Tak więc powyższy kod “działa”, ale zostaje zabity przez to niedorzeczne zachowanie Excela. Niezależnie od tego, w jaki sposób to zrobisz, utknąłeś w konieczności zmiany rozszerzenia na coś innego niż “.csv”, przykro mi! Po tym, jesteś w domu wolny.

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

Sugestia Wetmelona działa (nawet z .CSV), jeśli wykonasz następujące czynności:

  1. Otwórz program Excel na pusty skoroszyt lub arkusz roboczy
  2. Kliknij na Dane [Pobierz dane zewnętrzne] z tekstu
  3. Użyj “Kreatora importu tekstu” tak jak opisuje Wetmelon (delimitacja przecinkiem, zaznacz pierwszą kolumnę, SHIFT+CLICK ostatnią kolumnę, ustaw wszystko na Tekst).

Wiem, że jest to więcej kroków, ale przynajmniej pozwala mi to otwierać CSV w ten sposób bez konieczności zmiany rozszerzenia.

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

Uwaga!

Podczas korzystania z metody ręcznej “Excel → Dane → Pobierz dane zewnętrzne → Zaznacz wszystkie kolumny i wybierz Tekst”……

Spowoduje to ustawienie tylko tych kolumn na tekst, “które mają dane w pierwszym wierszu” (zwykle wiersz nagłówka). Kreator nie pokazuje kolumn znajdujących się dalej po prawej stronie, które mogą mieć dane poniżej, ale nie w pierwszym wierszu. Na przykład:

Wiersz1Col1, Wiersz1Col2, Wiersz1Col3

Wiersz2Col1, Wiersz2Col2, Wiersz2Col3, Wiersz2Col4

Nigdy nie zobaczysz kolumny 4 w kreatorze importu, więc nie będziesz miał możliwości zmiany jej formatu z ogólnego na tekstowy przed importem!!!!

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

Oto procedura alternatywna do kodu zamieszczonego powyżej przez Jean-François Corbett

Ta procedura zaimportuje plik csv do Excela ze wszystkimi kolumnami sformatowanymi jako Tekst

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

Jeśli zawsze importujesz te same dane (stały format rekordu, układ, itp…), możesz napisać makro Access używając specyfikacji importu, a następnie zrzucić dane z powrotem do Excela. Robiłem to wiele razy. Innym sposobem, w jaki to zrobiłem, jest użycie VBA i odczytywanie danych do arkusza po jednym rekordzie na raz i parsowanie ich w trakcie odczytu. O ile wiem, nie ma sposobu na ustawienie domyślnego formatu podczas importu w Excelu, a nawet gdybyś mógł, spowodowałoby to problemy z następnym typem pliku, który próbujesz parsować.

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

Zgodnie z prośbą, przesyłając mój komentarz jako odpowiedź (z dodaniem nieco więcej informacji):

Hej Scripting Guy zrobił artykuł na blogu o Importowanie CSV do Excela który może mieć kilka przydatnych ciekawostek dla ciebie. Granie z obiektem danych wewnątrz powershell może pozwolić ci zrobić to, co chcesz.

Chociaż artykuł konkretnie wspomina tylko o importowaniu danych do komórek, które mogą pozostawić format liczbowy, może być możliwe bawienie się niektórymi właściwościami i metodami ComObject Excela, aby zmusić dane do wprowadzenia do komórek jako surowy tekst zamiast tego (lub wymusić formatowanie komórek na tekst przed lub po imporcie).

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

Z nieznanych powodów, nawet jeśli jawnie podasz formaty dla wszystkich kolumn, Excel zignoruje je, jeśli rozszerzenie pliku to CSV.

Kilka opcji:

  • Utwórz zapytanie, aby zaimportować dane, jak sugeruje Wetmelon sugeruje .
    Wada: może brakować sterowników bazy danych CSV na 64-bitowej maszynie.

  • Użyj kodu Jeana , ale uwzględnij kopiowanie pliku do folderu tymczasowego i zmianę rozszerzenia kopii.
    Wady: Brak linku do oryginalnego pliku (zapisanie spowoduje nadpisanie kopii); będziesz musiał ręcznie usunąć kopię po zakończeniu. Mimo to można ręcznie zapisać jako nad oryginalnym CSV.

  • Otwórz CSV w Notatniku, Ctrl+A, Ctrl+C, wklej do Excela, następnie Data - Text to Columns, następnie jest to zwykły kreator, w którym możesz ustawić wszystkie kolumny na Text za jednym zamachem. Jest to inny smak poprzedniej opcji, ponieważ również ukrywa cenne rozszerzenie z Excela.
    Wada: ręczne.

  • Posiadanie bardzo prostej pętli VBA, która wczytuje cały plik do pamięci i umieszcza go na arkuszu, komórka po komórce.
    Wady: wolniejsza, brzydka.

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

Jeśli dobrze rozumiem pytanie, można to łatwo rozwiązać za pomocą opcji Transpose w Paste-Special, jak opisano tutaj .