Bagaimana saya bisa menghentikan Excel dari memakan file CSV saya yang lezat dan mengeluarkan data yang tidak berguna?

128

Saya memiliki database yang melacak penjualan widget berdasarkan nomor seri. Pengguna memasukkan data dan jumlah pembeli, dan memindai setiap widget ke dalam program klien khusus. Mereka kemudian menyelesaikan pesanan. Ini semua bekerja dengan sempurna.

Beberapa pelanggan menginginkan spreadsheet yang kompatibel dengan Excel dari widget yang telah mereka beli. Kami membuat ini dengan skrip PHP yang menanyakan database dan menampilkan hasilnya sebagai CSV dengan nama toko dan data terkait. Ini juga bekerja dengan sangat baik.

Ketika dibuka di editor teks seperti Notepad atau vi, file tersebut terlihat seperti ini:

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

Seperti yang Anda lihat, nomor seri ada (dalam hal ini dua kali, tidak semua serial sekunder adalah sama) dan merupakan rangkaian panjang angka. Ketika file ini dibuka di Excel, hasilnya menjadi:

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

Seperti yang mungkin telah Anda amati, nomor seri diapit oleh tanda kutip ganda. Excel tampaknya tidak menghargai kualifikasi teks dalam file .csv. Saat mengimpor file-file ini ke Access, kami tidak memiliki kesulitan. Saat membukanya sebagai teks, tidak ada masalah sama sekali. Tetapi Excel, tanpa gagal, mengubah file-file ini menjadi sampah yang tidak berguna. Mencoba menginstruksikan pengguna akhir dalam seni membuka file CSV dengan aplikasi non-standar menjadi, harus kita katakan, melelahkan. Apakah ada harapan? Apakah ada pengaturan yang tidak dapat saya temukan? Ini tampaknya menjadi kasus dengan Excel 2003, 2007, dan 2010.

Atroon
sumber
46
dapatkah saya memberi +1 hanya untuk namanya?
tombull89
11
Excel does not seem to respect text qualifiers in .csv files- tanda kutip ganda bukanlah kualifikasi teks, mereka hanya membolehkan koma dalam data Anda, jika Anda tidak menggunakan koma dalam data Anda maka mereka tidak berarti . Semua data dalam file CSV tidak diketik, jadi Excel hanya dapat menebak bahwa nomor seri besar Anda adalah angka , dan saat itulah Anda menjalankan ke presisi maksimum Excel 15 digit, yang merupakan apa yang memotong angka Anda.
DMA57361
1
Excel sepertinya tidak menghargai semua koma dalam tanda kutip ganda. Pertimbangkan "12 Agustus 2012" Excel yang mengubahnya menjadi sampah juga.
zundarz
5
Saya ingin menyebutkan pertanyaan SU ini . Ini menjelaskan opsi mana yang Anda miliki ketika berhadapan dengan CSV di Excel.
nixda
1
@nixda Terima kasih! Itu adalah saran yang berguna, terutama untuk pengguna yang lebih berpengalaman. Masalah saya hampir lebih merupakan masalah manusia, dalam hal itu Excel mengasosiasikan dirinya dengan file .csv, dan orang-orang melihat ikon, dan mengklik dua kali (karena itulah cara Anda membuka sesuatu), dan kemudian biasanya menekan Simpan (karena kami selalu memberi tahu mereka untuk Simpan!), dan semuanya hilang. Tapi saya pasti akan menggunakan metode Anda jika memungkinkan.
Atroon

Jawaban:

58

Tetapi Excel, tanpa gagal, mengubah file-file ini menjadi sampah yang tidak berguna.

Excel adalah sampah yang tidak berguna.

Larutan

Saya akan sedikit terkejut jika ada klien yang menginginkan data Anda dalam format Excel tidak dapat mengubah format yang terlihat pada tiga kolom menjadi "Angka" dengan nol tempat desimal atau ke "teks." Tetapi mari kita asumsikan bahwa cara mendokumentasikan yang singkat sudah tidak mungkin.

Pilihan Anda adalah:

  1. Lemparkan karakter non numerik, bukan spasi menjadi nomor seri Anda.
  2. Tuliskan file xls atau file xlsx dengan beberapa format default.
  3. Cheat dan output angka-angka itu sebagai rumus ="268435459705526269","",="268435459705526269"(Anda juga dapat ="268435459705526269",,="268435459705526269"menghemat 2 karakter sendiri). Ini memiliki keuntungan menampilkan dengan benar, dan mungkin secara umum bermanfaat, tetapi rusak secara halus (karena merupakan rumus).

Hati-hati dengan opsi 3, karena beberapa program (termasuk Excel & Open Office Calc), tidak akan lagi memperlakukan koma di dalam =""bidang sebagai lolos. Itu berarti ="abc,xyz"akan menjangkau dua kolom dan memecah impor.

Menggunakan format "=""abc,xy"""memecahkan masalah ini, tetapi metode ini masih membatasi Anda hingga 255 karakter karena batas panjang rumus Excel.

Tyler
sumber
1
Sebenarnya, itu tidak keras. Salin dan tempel salah satu angka di atas ke dalam Excel, lalu ubah format angka seperti yang disarankan. Excel mengubah nilainya, menghasilkan sampah.
Joe Internet
1
@ Jo, saya terlalu sepintas pada ikhtisar awal saya. Excel memang menghasilkan sampah, dan itu sendiri sampah. Saya telah memperbarui jawaban saya untuk mencerminkan hal itu. Sebuah opsi mungkin memiliki "Excel csv" dan juga memiliki "csv yang bermanfaat dan bermanfaat"
Tyler
2
@ Tyler - Saya tidak berpikir Excel adalah sampah, hanya mengatakan bahwa OP benar bahwa ia menghasilkan sampah dalam kasus ini. Ini sebenarnya pertanyaan yang sangat bagus, tanpa solusi yang tampaknya elegan.
Joe Internet
1
Opsi Format Cells ... telah disarankan, dan saya telah mencoba menggunakannya. Dalam hal ini, saat Anda membuka file, Excel tampaknya mengubah serial menjadi notasi Ilmiah (disepakati, tidak terduga) dan melemparkan ketepatan. Saat Anda mengubahnya menjadi angka atau teks, string tidak kembali. Itu benar-benar adalah inti dari masalah. Mengeluarkan sebagai formula mungkin melakukannya ... Saya tidak memikirkan itu.
Atroon
9
@ DMA57361 Perilaku ini tidak diharapkan, itu bisa ditentukan. Ketepatan angka didokumentasikan dengan baik, bagaimana excel membaca CSV tidak. Kurangnya peringatan dan data yang dibuang secara diam-diam adalah tidak masuk akal. Fakta bahwa Anda bahkan tidak bisa memberi tahu Excel cara mengimpor data sama tidak masuk akalnya. Apakah negativitas diperlukan ? Tidak, tapi kejujuran adalah kebijakan terbaik dan itulah yang saya rasakan.
Tyler
42

Kami memiliki masalah yang sama di mana kami memiliki file CSV dengan kolom yang berisi rentang seperti 3-5 dan Excel akan selalu mengonversinya menjadi tanggal misalnya 3-5 akan menjadi 3 Mar, setelah itu beralih kembali ke numerik memberi kami integer tanggal yang tidak berguna. Kami berhasil melewatinya

  1. Mengganti nama ekstensi CSV ke TXT
  2. Kemudian ketika kami membukanya di Excel, ini akan memulai panduan impor teks
  3. Pada Langkah 3 dari 3 di wisaya, kami memberi tahu kolom yang dimaksud adalah teks dan diimpor dengan benar.

Anda bisa melakukan hal yang sama di sini saya pikir.

panduan impor teks

Tepuk tangan

pengguna65525
sumber
2
+1 untuk menjadi cara yang benar untuk melakukannya. (sunting: maaf harus mengedit sedikit untuk mengklarifikasi solusi)
jay
2
Anda tidak perlu mengganti nama file Anda. Cukup gunakan panduan impor Shift-pilih semua kolom dan pilih sebagai teks.
nixda
1
Panduan Impor Teks adalah jawabannya. Semua solusi lain adalah peretasan yang tidak perlu karena tidak memahami cara menggunakan Excel untuk melihat dan mengedit CSV.
Excellll
1
@Excellll, melakukannya satu file pada satu waktu pasti. Saat mengotomatiskan proses ini, 'peretasan yang tidak perlu' sering menghemat hari.
Parrish Husband
1
ini sama sekali tidak berguna ketika excel digunakan oleh pengguna standar untuk menampilkan file CSV. sebelum saya mencoba menjelaskan cara menggunakan panduan impor-teks untuk ~ 15 pengguna kantor pemula, saya lebih suka mengetik sendiri kode sumber dokumen excel.
northkildonan
8

Solusi yang lebih baik adalah menghasilkan Buku Kerja XML. Seperti ini:

<?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>

File harus memiliki ekstensi .xml. Excel dan OpenOffice membukanya dengan benar.

dua puluh pelayan dipulihkan
sumber
Apakah maksud Anda OP harus menggunakan skrip PHP untuk mengubah database menjadi format XML?
Prasanna
2
Jauh lebih bersih daripada meminta pengguna membuka .csv di Excel atau mengacaukan CSV Anda sehingga hanya Excel yang dapat memahami CSV Anda. Bahkan tidak rumit skema.
binki
Di mana standar ini didokumentasikan? Saya ingin tahu lebih banyak tentang tipe data yang tersedia.
John Doherty
1

Solusi saya: Saya punya masalah yang sama dengan mengimpor nomor seri. Mereka tidak harus diperlakukan sebagai angka, yaitu tidak ada fungsi matematika yang dilakukan di atasnya, tetapi kita perlu seluruh angka di sana. Hal paling sederhana yang saya miliki adalah memasukkan spasi di nomor seri. mis. "12345678 90123456 1234". Saat Excel mengimpornya, itu akan diperlakukan sebagai teks dan bukan numerik.

Peterlip
sumber
0

Saya memiliki nomor rekening lama yang kacau.

Beginilah cara saya memperbaikinya:

Buka file.csv Anda di Libre Office / Open Office (Anda mungkin harus menentukan pembatas dll.) Kemudian menyimpan file sebagai file Excel XML.

Kemudian buka file ini di Excel dan kemudian Anda akan melihat kolom tidak lagi diubah menjadi format ilmiah atau apa pun. Agar aman klik kanan kolom dan secara eksplisit mengatur format sebagai Teks, lalu simpan sebagai format file Excel.

Buka file format Excel dan kolom masih boleh ok!

pengguna127379
sumber
1
Walaupun ini akan berhasil, mencoba menjelaskan kepada seseorang yang hanya bisa berbahasa Inggris mengapa dia perlu menggunakan office suite yang berbeda menciptakan banyak masalah yang bisa dipecahkan. Perangkat lunak alternatif untuk M $ Office semuanya baik menurut pendapat saya sendiri, tetapi saya menyadari bahwa saya tidak dapat mengonversi semua orang.
Atroon
0

Panduan Impor adalah solusi terbaik untuk pengguna biasa dan situasi sekali saja. Jika Anda membutuhkan solusi terprogram, Anda dapat menggunakan metode QueryTables.Add (yang digunakan oleh Wizard Impor di belakang layar).

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
PBeezy
sumber