Saya punya file excel dengan konten seperti ini:
A1: SomeString
A2: 2
Semua bidang diatur ke format String.
Ketika saya membaca file dalam java menggunakan POI, ia memberi tahu bahwa A2 dalam format sel numerik.
- Masalahnya adalah bahwa nilai dalam A2 bisa 2 atau 2.0 (dan saya ingin bisa membedakannya) jadi saya tidak bisa begitu saja menggunakan
.toString()
.
Apa yang bisa saya lakukan untuk membaca nilai sebagai string?
java
excel
apache-poi
pengumpul sukacita
sumber
sumber
Saya tidak berpikir kita memiliki kelas ini kembali ketika Anda mengajukan pertanyaan, tetapi hari ini ada jawaban yang mudah.
Apa yang ingin Anda lakukan adalah menggunakan kelas DataFormatter . Anda melewatkan sel ini, dan ia melakukan yang terbaik untuk mengembalikan Anda sebuah string yang berisi apa yang akan ditunjukkan Excel kepada Anda untuk sel itu. Jika Anda memberikannya sel string, Anda akan mendapatkan string kembali. Jika Anda memberikannya sel numerik dengan aturan pemformatan yang diterapkan, itu akan memformat angka berdasarkan pada mereka dan memberikan Anda string kembali.
Untuk kasus Anda, saya berasumsi bahwa sel numerik memiliki aturan pemformatan bilangan bulat yang diterapkan padanya. Jika Anda meminta DataFormatter untuk memformat sel-sel itu, itu akan memberi Anda kembali string dengan string integer di dalamnya.
Juga, perhatikan bahwa banyak orang menyarankan melakukan
cell.setCellType(Cell.CELL_TYPE_STRING)
, tetapi Apache POI JavaDocs cukup jelas menyatakan bahwa Anda tidak boleh melakukan ini ! MelakukansetCellType
panggilan akan kehilangan pemformatan, karena javadocs menjelaskan satu-satunya cara untuk mengkonversi ke String dengan pemformatan yang tersisa adalah dengan menggunakan kelas DataFormatter .sumber
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
Kode di bawah ini berfungsi untuk saya untuk semua jenis sel.
sumber
getCreationHelper().createFormulaEvaluator()
metode ini. Dengan cara ini kode Anda tidak akan digabungkan dengan kelas HSSFFormulaEvaluator.FormulaEvaluator
dihapus dari solusi ini? Apakah itu melayani tujuan?Saya akan merekomendasikan pendekatan berikut ketika memodifikasi tipe sel tidak diinginkan:
NumberToTextConverter dapat dengan benar mengkonversi nilai ganda ke teks menggunakan aturan Excel tanpa kehilangan presisi.
sumber
Seperti yang telah disebutkan dalam JavaDocs milik Poi ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) jangan gunakan:
tapi gunakan:
Contoh lebih lanjut tentang http://massapi.com/class/da/DataFormatter.html
sumber
Ya, ini bekerja dengan sempurna
direkomendasikan:
tua:
bahkan jika Anda memiliki masalah dengan mengambil nilai dari
cell
memiliki rumus, tetap ini berfungsi.sumber
Mencoba:
Haruskah memformat nomor dengan benar.
sumber
2
dan2.0
. Solusi Anda tidak akan melakukan ini. (Tapi tetap saja, selamat datang di Stack Overflow!)Selama sel dalam format teks sebelum pengguna mengetikkan angka, POI akan memungkinkan Anda untuk mendapatkan nilai sebagai string. Salah satu kuncinya adalah bahwa jika ada segitiga hijau kecil di sudut kiri atas sel yang diformat sebagai Teks, Anda akan dapat mengambil nilainya sebagai string (segitiga hijau muncul setiap kali sesuatu yang tampaknya berupa angka dipaksa ke dalam format teks). Jika Anda memiliki sel yang diformat Teks yang berisi angka, tetapi POI tidak akan membiarkan Anda mengambil nilai-nilai itu sebagai string, ada beberapa hal yang bisa Anda lakukan untuk data Spreadsheet agar memungkinkan:
Satu hal terakhir yang bisa Anda lakukan adalah jika Anda menggunakan POI untuk mendapatkan data dari spreadsheet Excel 2007, Anda bisa menggunakan metode kelas 'getRawValue ()'. Ini tidak peduli apa formatnya. Ini hanya akan mengembalikan string dengan data mentah.
sumber
Ketika kita membaca nilai sel numerik MS Excel menggunakan perpustakaan Apache POI, itu membacanya sebagai angka. Tetapi kadang-kadang kita ingin itu dibaca sebagai string (mis. Nomor telepon, dll.). Beginilah cara saya melakukannya:
Masukkan kolom baru dengan sel pertama = CONCATENATE ("!", D2). Saya menganggap D2 adalah id sel dari kolom nomor telepon Anda. Seret sel baru ke ujung.
Sekarang jika Anda membaca sel menggunakan POI, itu akan membaca rumus, bukan nilai yang dihitung. Sekarang lakukan yang berikut:
Tambahkan kolom lain
Pilih kolom lengkap yang dibuat pada langkah 1. dan pilih Edit-> COPY
Pergi ke sel atas kolom yang dibuat pada langkah 3. dan Pilih Edit-> Tempel Spesial
Di jendela yang terbuka, Pilih tombol radio "Nilai"
Pilih "OK"
Sekarang baca menggunakan POI API ... setelah membaca di Jawa ... hapus saja karakter pertama yaitu "!"
sumber
Saya juga memiliki masalah serupa pada kumpulan data ribuan angka dan saya pikir saya telah menemukan cara sederhana untuk menyelesaikannya. Saya perlu memasukkan tanda kutip sebelum angka sehingga impor DB terpisah selalu melihat angka sebagai teks. Sebelum ini angka 8 akan diimpor sebagai 8.0.
Larutan:
Hai Presto semua angka tetapi disimpan sebagai Teks.
sumber
getStringCellValue mengembalikan NumberFormatException jika jenis selnya numerik. Jika Anda tidak ingin mengubah jenis sel menjadi string, Anda bisa melakukan ini.
sumber
Banyak dari jawaban ini merujuk pada dokumentasi dan kelas POI lama. Dalam POI 3.16 terbaru, Cell dengan tipe int telah ditinggalkan
Sebaliknya enum CellType dapat digunakan.
Pastikan untuk memperbarui pom Anda dengan dependensi poi serta ketergantungan poi-ooxml ke versi 3.16 yang baru jika tidak Anda akan terus mendapatkan pengecualian. Satu keuntungan dengan versi ini adalah Anda dapat menentukan jenis sel pada saat sel dibuat menghilangkan semua langkah ekstra yang dijelaskan dalam jawaban sebelumnya:
sumber
Saya lebih suka pergi ke rute jawaban wil atau Vinayak Dornala, sayangnya mereka mempengaruhi kinerja saya jauh ke banyak. Saya mencari solusi HACKY dari casting implisit:
Saya tidak menyarankan Anda melakukan ini, karena situasi saya berhasil karena sifat dari bagaimana sistem bekerja dan saya memiliki sumber file yang dapat diandalkan.
Footnote: numericColumn Adalah int yang dihasilkan dari membaca header file yang diproses.
sumber
Saya Mencoba Ini dan Ini Berhasil untuk Saya
sumber
Apakah Anda tetap mengendalikan lembar kerja excel? Apakah ada template yang dimiliki pengguna untuk memberi Anda input? Jika demikian, Anda dapat meminta kode memformat sel input untuk Anda.
sumber
Sepertinya ini tidak dapat dilakukan dalam versi POI saat ini, berdasarkan fakta bahwa bug ini:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
masih beredar.
sumber
cell.setCellType (Cell.CELL_TYPE_STRING); bekerja dengan baik untuk saya
sumber
Ini bekerja sempurna untuk saya.
sumber
Kami memiliki masalah yang sama dan memaksa pengguna kami untuk memformat sel sebagai 'teks' sebelum memasukkan nilainya. Dengan cara itu Excel dengan benar menyimpan angka genap sebagai teks. Jika format diubah setelahnya, Excel hanya mengubah cara nilai ditampilkan tetapi tidak mengubah cara nilai disimpan kecuali nilainya dimasukkan lagi (misalnya dengan menekan kembali ketika di dalam sel).
Baik atau tidaknya Excel menyimpan nilai sebagai teks ditunjukkan oleh segitiga hijau kecil yang ditampilkan Excel di sudut kiri atas sel jika dianggap sel berisi angka tetapi diformat sebagai teks.
sumber
dilemparkan ke int lalu lakukan a
.toString()
. Itu jelek tapi berhasil.sumber