Excel sayfalarını java'da okumak için daha iyi API nedir - JXL veya Apache POI [kapalı]


94

Excel sayfalarını okumak / yazmak / düzenlemek için 2 API'den hangisi daha kolaydır? Bu API'ler CSV uzantılarını desteklemiyor mu?

File.xls ve file.xlsx için JXL kullanarak, aşağıdaki gibi bir istisna alıyorum:

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:268)
    at core.ReadXLSheet.contentReading(ReadXLSheet.java:46)
    at core.ReadXLSheet.init(ReadXLSheet.java:22)
    at core.ReadXLSheet.main(ReadXLSheet.java:72)

Hem .xls hem de .xlsx uzantıları için. Kullandığım Java Sürümü: JDK1.6


1
Peki ya: "Java'da Microsoft Excel elektronik tablolarını (JXL, Apache POI, vb.) Okumak / yazmak için hangi API'ler var? Her birini kullanmak için en iyi senaryolar nelerdir?"
Cléssio Mendes

Yanıtlar:


258

Hem JXL (şimdi "JExcel") hem de Apache POI kullandım . İlk başta JXL kullandım ama şimdi Apache POI kullanıyorum.

İlk olarak, her iki API'nin aynı son işlevselliğe sahip olduğu şeyler şunlardır:

  • İkisi de bedava
  • Hücre stili: hizalama, arka planlar (renkler ve desenler), kenarlıklar (türler ve renkler), yazı tipi desteği (yazı tipi adları, renkler, boyut, kalın, italik, üstü çizili, altı çizili)
  • Formüller
  • Köprüler
  • Birleştirilmiş hücre bölgeleri
  • Satırların ve sütunların boyutu
  • Veri biçimlendirme: Sayılar ve Tarihler
  • Hücreler içinde metin kaydırma
  • Donma bölmeleri
  • Üstbilgi / Altbilgi desteği
  • Mevcut ve yeni e-tabloları okuyun / yazın
  • Her ikisi de, okudukları elektronik tablolardaki mevcut nesneleri olabildiğince bozulmadan tutmaya çalışır.

Bununla birlikte, birçok farklılık vardır:

  • Belki de en önemli fark, Java JXL'in Excel 2007+ ".xlsx" biçimini desteklememesidir; yalnızca eski BIFF (ikili) ".xls" biçimini destekler. Apache POI, ortak bir tasarımla her ikisini de destekler.
  • Ek olarak, bir C # API varmış gibi görünse de, JXL API'nin Java kısmı en son 2009'da güncellendi (3 yıl, 4 ay önce bunu yazarken). Apache POI aktif olarak korunur.
  • JXL Koşullu Biçimlendirmeyi desteklemez, Apache POI bunu destekler, ancak bu o kadar önemli değildir, çünkü hücreleri koşullu olarak kendi kodunuzla biçimlendirebilirsiniz.
  • JXL zengin metin biçimlendirmesini, yani bir metin dizesi içinde farklı biçimlendirmeyi desteklemez ; Apache POI bunu destekliyor.
  • JXL yalnızca belirli metin döndürmelerini destekler: yatay / dikey, +/- 45 derece ve yığınlanmış; Apache POI herhangi bir tamsayı derece artı yığılmış dereceyi destekler.
  • JXL çizim şekillerini desteklemez; Apache POI yapar.
  • JXL, Yatay / Dikey, Kenar Boşlukları, Kağıt boyutu ve Yakınlaştırma gibi çoğu Sayfa Yapısı ayarını destekler. Apache POI, tüm bunların yanı sıra Yinelenen Satırları ve Sütunları destekler.
  • JXL, Bölünmüş Bölmeleri desteklemez; Apache POI yapar.
  • JXL, Grafik oluşturmayı veya değiştirmeyi desteklemez; bu destek Apache POI'de henüz yok, ancak bir API yavaş yavaş oluşmaya başlıyor.
  • Apache POI, JXL'den daha kapsamlı bir dokümantasyon ve örnekler setine sahiptir.

Ek olarak, POI yalnızca ana "kullanıcı modeli" API'sini değil, aynı zamanda tek yapmak istediğiniz elektronik tablo içeriğini okumaksa olay tabanlı bir API'yi de içerir.

Sonuç olarak, daha iyi dokümantasyon, daha fazla özellik, aktif geliştirme ve Excel 2007+ format desteği nedeniyle Apache POI kullanıyorum.


Ayrıntılı açıklama için teşekkürler.
Swagatika

8
Net, özlü ve son derece yararlı için +1
Ron

1
getContents()JExcelAPI'deki kirli yöntem bana çok zaman kazandırıyor. POI ile, hücre türünü kontrol etmeli, sonra değerini almalısınız (Sayısal hücre ise, bir Tarih hücresi olup olmadığını kontrol etmeniz gerekir) ve sonunda farklı yöntemlerle String değerine dönüştürmelisiniz, bu çok sakıncalıdır. POI'nin JExcelAPI'nin yaptığı kadar kirli ama kullanışlı bir yöntem sağlamadığını hayal edemiyorum.
LiuYan 刘 研

1
POI olay temelli okumaysa çok olumlu bir şey. Özellikle mobil cihazlarda (= Android), bu, sınırlı yığın boyutları ve GC ile uğraşırken çok yardımcı olur. JXL ile basit bir XLS okumak genellikle uygulamanın bellek sınırına ulaşarak uygulamanın çökmesine neden oluyordu.
dermatthias

2
POI'ye geçmemi sağlayan önemli faktörlerden biri, büyük miktarda veriyle excel'i okumak istediğinizde şart olan steaming API'yi kullanma esnekliğidir. Excel'deki veriler çok büyükse, excel'i açtığınızda tüm verilerin belleğe yüklenmesini istemezsiniz. Akışla, excel'inizin / herhangi bir ofis belgenizin tüm içeriği, sayfayı ayrıştırdıktan hemen sonra belleğe yüklenmez.
Ashok Koyi

12

İÇN kullandım.

Bunu kullanırsanız, şu hücre biçimlendiricilerini göz önünde bulundurun: bir tane oluşturun ve her seferinde hücre için oluşturmak yerine birkaç kez kullanın, bu çok büyük bir bellek tüketimi farkı veya büyük veri.


5

JXL'e aşina değilim ama biz POI kullanıyoruz. POI iyi korunur ve hem ikili .xls biçimini hem de Office 2007'de tanıtılan yeni xml tabanlı biçimi işleyebilir.

CSV dosyaları excel dosyaları değil, metin tabanlı dosyalardır, bu nedenle bu kitaplıklar onları okumaz. Bir CSV dosyasını kendiniz ayrıştırmanız gerekecektir. Herhangi bir CSV dosya kitaplığından haberdar değilim, ancak bakmadım.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.