Bagaimana saya bisa mengatur Excel untuk selalu mengimpor semua kolom file CSV sebagai Teks?

68

Meskipun saya mencoba menghindarinya, kadang-kadang saya harus membuka file CSV di Excel. Ketika saya melakukannya, itu memformat kolom yang berisi angka, yang membuatnya tidak berguna untuk tujuan saya. Sejauh yang saya tahu, satu-satunya cara untuk mencegah hal ini terjadi saat impor adalah dengan mengganti nama file sehingga ekstensi tersebut bukan .csv dan gunakan panduan impor untuk menentukan format setiap kolom secara individual. Untuk file dengan 50-60 kolom, ini tidak praktis.

Karena setiap jawaban untuk pertanyaan yang sering diajukan di internet ini menyarankan beberapa cara untuk mengkonversi angka yang diformat kembali setelah file dibuka (yang tidak akan bekerja untuk saya - saya ingin menyelesaikan masalah umum, bukan beberapa kasus tertentu) atau secara manual memilih jenis format setiap kolom (yang tidak ingin saya lakukan), saya mencari cara untuk mengatur preferensi atau gaya global sehingga semua kolom dari semua file CSV yang dibuka selalu diformat sebagai teks. Saya tahu tentang "melindungi" angka-angka dengan tanda kutip juga, tetapi file yang saya dapatkan tidak datang seperti itu dan saya berharap untuk menghindari keharusan untuk melakukan pra-proses file sehingga Excel tidak mengacaukannya.

Apakah ada cara untuk melakukan ini secara spesifik : Selalu memformat semua kolom dalam file CSV yang dibuka sebagai teks, tanpa secara manual memilih setiap kolom setiap kali selama impor?

Saya menggunakan Excel 2003, tetapi saya akan mengambil jawaban untuk tahun 2007 jika itu yang Anda tahu.

William Gunn
sumber
1
Hey Scripting Guy membuat artikel blog tentang Mengimpor CSV ke Excel yang mungkin memiliki beberapa informasi berguna untuk Anda. Bermain dengan objek data di dalam PowerShell memungkinkan Anda untuk melakukan apa yang Anda inginkan. Tidak diposting sebagai jawaban karena itu pada dasarnya hanya tautan di luar kantor, tetapi mungkin ada sesuatu yang berguna bagi Anda.
Matrix Mole

Jawaban:

7

Ini bekerja:

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

Pemakaian:

OpenCsvAsText "C:\MyDir\MyFile.txt"

File yang dipisahkan koma sekarang terbuka sebagai lembar Excel dengan semua kolom diformat sebagai teks.

Perhatikan bahwa solusi wizard @ Wetmelon berfungsi dengan baik, tetapi jika Anda membuka banyak file, Anda mungkin, seperti saya, menjadi lelah, setiap kali, menggulir ke kolom 60 untuk menggeser-kliknya.

EDIT @GSerg menyatakan dalam komentar di bawah bahwa ini "tidak berfungsi" dan "makan spasi dan memimpin nol". Saya hanya akan mengutip komentar untuk pertanyaan, yang lebih deskriptif:

Untuk alasan yang tidak diketahui, bahkan jika Anda secara eksplisit menyediakan format untuk semua kolom di VBA, Excel akan mengabaikannya jika ekstensi file CSV. Segera setelah Anda mengubah ekstensi, kode yang sama akan menghasilkan hasil yang benar.

Jadi kode di atas "berfungsi", tetapi terbunuh oleh perilaku Excel yang konyol ini. Apa pun cara Anda memotongnya, Anda harus mengubah ekstensi menjadi sesuatu selain ".csv", maaf! Setelah itu, Anda bebas di rumah.

Jean-François Corbett
sumber
1
Tidak bekerja Makan ruang, makan nol terkemuka dll.
GSerg
1
Metode yang digunakan Workbooks.OpenTextmemiliki kekurangan dengan desain (Lihat jawaban saya di bawah). Gunakan QueryTablessebagai gantinya.
nixda
71

Cara membuka CSV di Excel

Cara yang baik

  • Excel → Data → Dapatkan data eksternal → Pilih semua kolom dengan Shiftdan pilih Teks

    Terbalik: Memperlakukan semua nilai dengan benar sebagai teks tanpa kecuali

    Kelemahan: Lebih banyak langkah daripada klik dua kali sederhana

Jalan yang buruk

  • Buka CSV dengan Klik Dua Kali atau dialog Buka dengan Excel

    Kelemahan: Penangan CSV internal Excel salah mengartikan nilai dengan tanda -atau =tanda sebagai rumus alih-alih teks

    Kelemahan: Anda akan kehilangan nol di depan dari nilai biner seperti 0001karena format kolom yang terdeteksi otomatis oleh Excel

Cara yang bagus (untuk VBA)

  • Gunakan QueryTables (mitra VBA untuk Get external data) → kode contoh

    Terbalik: Memperlakukan semua nilai dengan benar sebagai teks tanpa kecuali

    Kelemahan: Sedikit kode lebih banyak daripada OpenTextmetode

Cara buruk (untuk VBA)

  • Gunakan Workbooks.OpenTextmetode → Kode contoh

    Kelemahan: Metode ini masih menggunakan pengontrol impor CSV internal Excel dengan semua kekurangannya

    Kelemahan: Selain itu, fieldinfoparameter OpenTextdiabaikan jika ekstensi CSV. Biasanya, parameter ini memungkinkan Anda memilih setiap format kolom, tetapi tidak jika ekstensi CSV. Anda dapat membaca lebih lanjut tentang perilaku ini di Stack Overflow

    Mengganti nama sementara ekstensi sumber dari CSV ke TXT dan kemudian kembali ke CSV adalah solusi yang valid jika Anda memiliki kontrol penuh atas file sumber

Metode tambahan

  • Jika Anda memiliki akses ke sumber yang membuat CSV Anda, Anda dapat mengubah sintaks CSV.
    Lampirkan setiap nilai dengan tanda kutip ganda dan ="00001"awali tanda sama dengan atau tambahkan satu tab ke setiap nilai. Kedua cara akan memaksa Excel untuk memperlakukan nilai sebagai teks

    Konten CSV asli
    masukkan deskripsi gambar di sini

    CSV di Excel saat dibuka melalui klik ganda
    masukkan deskripsi gambar di sini

    Perhatikan bagaimana baris 2 (metode kutipan ganda) dan baris 3 (metode tab) tidak diubah oleh Excel

  • Buka CSV di Notepad dan salin & tempel semua nilai ke Excel. Kemudian gunakan Data - Teks ke Kolom
    Kelemahan: Teks dalam Kolom untuk mengubah format kolom dari umum ke teks menghasilkan hasil yang tidak konsisten. Jika nilai berisi -dikelilingi oleh karakter (mis. "= E1-S1"), Excel mencoba untuk membagi nilai itu menjadi lebih dari satu kolom. Nilai yang terletak tepat di sel itu bisa ditimpa

    (Perilaku Teks ke kolom diubah di suatu tempat antara Excel 2007 dan 2013 sehingga tidak berfungsi lagi)


Add-In Excel untuk membuka CSV dan mengimpor semua nilai sebagai teks

Ini adalah Plug-in Excel untuk menyederhanakan tindakan Impor CSV.
Keuntungan utama: Ini adalah solusi satu kali klik dan menggunakan QueryTables, metode antipeluru yang sama di belakang Dapatkan data eksternal

  • Itu menambahkan perintah menu baru ke Excel yang memungkinkan Anda mengimpor file CSV dan TXT. Semua nilai diimpor ke lembar aktif mulai dari sel yang saat ini dipilih
  • Add-in Excel tersedia untuk semua versi Office di Windows dan Mac
  • Seluruh Add-In hanya memiliki 35 baris kode. Periksa kode sumber yang dikomentari jika Anda penasaran
  • Pemisah daftar CSV yang digunakan (koma atau titik koma) diambil dari pengaturan Excel lokal Anda
  • Pengkodean diatur ke UTF-8

Instalasi

  1. Unduh Add-In dan simpan ke folder Add-in Anda:%appdata%\Microsoft\AddIns
  2. Buka Excel dan aktifkan Add-In: File tab → Options → Add-Ins → Go Todan pilihImportCSV.xla
  3. Aktifkan makro VBA: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Mulai ulang Excel

Anda akan melihat entri bilah menu baru bernama Add-Ins dan Anda menggunakan tombol ini untuk dengan cepat membuka file CSV Anda tanpa harus melalui kerumitan dialog Impor

masukkan deskripsi gambar di sini


Skrip PowerShell untuk membuka CSV langsung dari Windows Explorer

Anda dapat menggunakan skrip PowerShell untuk membuka file CSV dan secara otomatis meneruskannya ke Excel. Script diam-diam menggunakan metode impor teks Excel yang memperlakukan nilai selalu sebagai teks dan, sebagai bonus, menangani pengkodean UTF-8

  1. Buat file teks baru dan rekatkan script di bawah ini. Versi komentar dapat ditemukan di sini
$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. Simpan di suatu tempat seperti C:\my\folder\myScript.ps1. (Perhatikan ekstensi .ps1)
    • Buka folder sendto Anda melalui WinR» shell:sendto» Enter
  2. Buat pintasan baru melalui Klik kanan »Baru» Pintasan dan tempel baris ini. Jangan lupa untuk mengubah jalur ke jalur Anda sendiri di mana Anda telah menempatkan skrip Anda. Beri nama pintasan, misalnya, Excel

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

Sekarang Anda dapat memilih (banyak) CSV dan membukanya di Excel via Right-click » SendTo » Excel

nixda
sumber
1
Add-In diuji dengan Office 2003 dan 2013
nixda
"Cara Terbaik" teratas persis seperti yang saya butuhkan untuk impor sekali saja. Tidak perlu dipusingkan dengan VBA dan bahkan dapat mengontrol kolom apa yang diambil sebagai tanggal / angka (dengan sisanya diambil sebagai teks). Saya berharap Excel akan menawarkan untuk membuka panduan impor ini ketika mengklik dua kali pada CSV.
ADTC
@ Vadzim Halo, saya menghargai usaha Anda untuk memperbaiki tautan mati. Memang ge.tt membuat beberapa masalah dalam beberapa bulan terakhir. Tetapi saya pikir saya telah memperbaiki semua masalah dan tautan lama yang asli akan berfungsi kembali. Saya tidak tahu mengapa Google Chrome memperingatkan sebelum mengunduh apa pun dari ge.tt. Tetapi semua browser lain bekerja normal dan saya dapat meyakinkan Anda bahwa mereka bukan malware
nixda
@nixda, terima kasih telah menghidupkan kembali tautan dan untuk jawaban yang bagus
Vadzim
@nixda Tautan ke ge.tt sekali lagi rusak. Sebagian besar mengatakan mereka tidak tersedia karena pemiliknya melanggar TOS. Namun, yang untuk OpenCSV.exe mengatakan " File - file ini tidak lagi tersedia karena mereka melanggar persyaratan layanan." Yang membuat saya bertanya, apakah Anda penulis fungsi Excel ImportMyCSV? (kode sumber masih tersedia di pastebin) Ini adalah alat yang luar biasa - Saya menggunakannya di tempat kerja dan merekomendasikannya kepada orang lain. Tapi saya tertarik pada asal kode, jika tidak ada yang lain, untuk benar-benar menghargai penulis
GlennFromIowa
5

Anda dapat mencoba dengan membuka .xlsx terlebih dahulu, kemudian membuat koneksi data dan mengimpor .csv. Pilih "koma" dibatasi, lalu pilih opsi untuk memperlakukan semua kolom sebagai teks daripada "Umum".

Sunting: Oh, saya tidak sepenuhnya membaca pertanyaan. Di panduan impor, pilih tajuk kolom pertama yang ingin Anda impor sebagai teks, gulir ke tajuk kolom terakhir, dan Shift + Klik tajuk. Kemudian pilih opsi radial "Teks".


sumber
2
Ya, ini berfungsi dengan baik - selama ekstensi file bukan ".csv". +1
Jean-François Corbett
4

Saran Wetmelon berfungsi (bahkan dengan .CSV) jika Anda melakukan hal berikut:

  1. Buka Excel ke buku kerja atau lembar kerja kosong
  2. Klik untuk Data> [Dapatkan Data Eksternal] Dari Teks
  3. Gunakan "Text Import Wizard" seperti yang dijelaskan oleh Wetmelon (Comma delimted, pilih kolom pertama, SHIFT + KLIK kolom terakhir, atur semuanya ke Teks).

Saya tahu ini lebih banyak langkah, tetapi setidaknya ini memungkinkan saya membuka CSV dengan cara ini tanpa harus mengubah ekstensi

Colorado Techie
sumber
2

Awas!

Saat menggunakan metode manual "Excel → Data → Dapatkan data eksternal → Pilih semua kolom dan pilih Teks" ......

Ini hanya akan mengatur kolom menjadi teks "yang memiliki data di baris pertama" (biasanya baris tajuk). Wisaya ini tidak menunjukkan kolom lebih jauh ke kanan yang mungkin memiliki data lebih lanjut di bawah ini tetapi tidak di baris pertama. Sebagai contoh:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

Anda tidak akan pernah melihat Kol 4 di panduan impor sehingga Anda tidak akan mendapatkan opsi untuk mengubahnya dari umum ke format teks sebelum mengimpor !!!!

PeterV
sumber
1
Peringatan yang bagus, karena 99,9999% dari waktu, orang tidak gulir ke bawah di panduan impor, dan bahkan kemudian sulit untuk menangkap semua kolom. Namun, secara teknis, Anda dapat menggulir ke bawah saat Anda berada di panduan Impor dan menangkap kolom tambahan yang tidak memiliki data di baris pertama.
GlennFromIowa
1

Berikut adalah prosedur alternatif untuk kode yang diposting di atas oleh Jean-François Corbett

Prosedur ini akan mengimpor file csv ke Excel dengan semua kolom diformat sebagai Teks

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
sumber
Selamat datang di SuperUser, alih-alih menambahkan jawaban baru, Anda harus mengedit jawaban Corbett dan memperbaikinya. Saya menyadari Anda belum memiliki reputasi yang cukup untuk melakukan itu, tetapi Anda dapat menautkan perubahan Anda dalam komentar di mana Anda memintanya untuk membacanya.
Vlastimil Ovčáčík
0

Jika Anda selalu mengimpor data yang sama (format rekaman konstan, tata letak, dll ...) Anda bisa menulis makro Access menggunakan spesifikasi impor dan kemudian membuang data kembali ke Excel. Selesai ini mungkin kali. Cara lain yang telah saya lakukan adalah dengan menggunakan VBA dan membaca data ke dalam lembar kerja satu catatan sekaligus dan menguraikannya saat dibaca. Sejauh yang saya tahu tidak ada cara untuk mengatur format default selama impor di Excel dan bahkan jika Anda bisa itu akan menyebabkan masalah dengan jenis file berikutnya yang Anda coba parsing.

pengguna88859
sumber
1
Ini masalahnya - Saya tidak mencoba melakukan penguraian apa pun kecuali untuk menempatkan string teks yang ada di antara koma ke dalam kolom ketika saya mengimpornya. Jika saya perlu diformat dengan cara tertentu, saya kemudian dapat melakukan itu (seperti membuat tanggal string tanggal, dll), tetapi saya hanya perlu data yang ditinggalkan sendirian pada awalnya. Mengapa itu harus begitu sulit?
William Gunn
0

Sebagai permintaan, kirimkan komentar saya sebagai jawaban (dengan sedikit info tambahan ditambahkan):

Hey Scripting Guy membuat artikel blog tentang Mengimpor CSV ke Excel yang mungkin memiliki beberapa informasi berguna untuk Anda. Bermain dengan objek data di dalam PowerShell memungkinkan Anda untuk melakukan apa yang Anda inginkan.

Meskipun artikel secara khusus hanya menyebutkan mengimpor data ke dalam sel yang dapat meninggalkan format angka, dimungkinkan untuk bermain-main dengan beberapa properti Excel ComObject dan metode untuk memaksa data untuk memasukkan sel sebagai teks mentah sebagai gantinya (atau memaksa pemformatan sel ke dalam teks sebelum atau setelah impor).

Matriks Mole
sumber
0

Untuk alasan yang tidak diketahui, bahkan jika Anda secara eksplisit menyediakan format untuk semua kolom, Excel akan mengabaikannya jika ekstensi file CSV.

Beberapa opsi:

  • Buat kueri untuk mengimpor data, seperti yang disarankan Wetmelon .
    Kerugian: Anda mungkin kehilangan driver database CSV pada mesin 64-bit.

  • Gunakan kode Jean , tetapi sertakan menyalin file ke folder sementara dan mengubah ekstensi salinan.
    Kerugian: Tidak ada tautan ke file asli (menyimpan akan menimpa salinan); Anda harus menghapus salinan secara manual setelahnya. Namun, Anda dapat secara manual Simpan Sebagai di CSV asli.

  • Buka CSV di Notepad, Ctrl+A, Ctrl+C, paste untuk Excel, kemudian data - Teks untuk Kolom, maka itu wizard biasa di mana Anda dapat mengatur semua kolom Teks dalam satu pergi. Ini rasa yang berbeda dari opsi sebelumnya, karena ia juga menyembunyikan ekstensi yang berharga dari Excel.
    Kerugian: manual.

  • Memiliki loop VBA yang sangat sederhana yang membaca seluruh file ke dalam memori dan meletakkannya di atas sel, sel demi sel.
    Kerugian: lebih lambat, jelek.

GSerg
sumber
Bukankah "Tidak ada tautan ke file [CSV] asli" merupakan kelemahan dari semua metode ini? Saya suka gagasan menyalin ke folder temp dan mengubah ekstensi di sana ... Bahkan bisa menimpa yang asli (sebagai CSV) segera setelah salinan terbuka.
Jean-François Corbett
@ Jean-FrançoisCorbett, saya menggunakan Panduan Impor sepanjang waktu untuk mengimpor file .csv dengan ekstensi csv ke Excel 2010. Saya secara eksplisit menentukan format kolom sebagai Teks dan mempertahankan format sel sebagai teks. Mungkin ini masalah dengan versi Excel yang lebih lama?
GlennFromIowa
-2

Jika saya memahami pertanyaan dengan benar, ini mudah diselesaikan dengan menggunakan opsi Transpose di Tempel-Khusus seperti yang dijelaskan di sini .

Rodger
sumber