8 Ağustos 2012 Çarşamba

JExcel ve Apache POI

JExcel ve RowsExceededException
JExcel API'si eski olduğu için büyük excel dosyaları üretirken 65536 satırdan fazla satır yaratılmaya çalışılırsa RowsExceededException exception'ı atıyor. WritableSheetImpl.java dosyasındaki bu satır hatanın sebebi.

Büyük dosyalar üretmek için http://poi.apache.org/spreadsheet/how-to.html adresinde örnek verildiği gibi SXSSFWorkbook sınıfını kullanmak lazım. Zaten bu sınıfın açıklamasında da "Streaming version of XSSFWorkbook implementing the "BigGridDemo" strategy. " yazıyor.


JExcel ve Yuvarlama Hatası
JExcel kullanırken Number tipi alanların değerlerini getContents() metodu ile String olarak alırken dikkatli olmak lazım. Çünkü jxl.read.biff.NumberRecord sınıfı kendi içinde aşağıdaki gibi bir DecimalFormat nesnesi tutuyor. Ancak bu nesne sadece 3 hane hassasiyete kadar doğru değerleri döndürüyor. Eğer girilen değer daha fazla hassasiyete sahipse sonuç yuvarlanarak veriliyor ki bu da farkında olmadan hatalara sebep olabilir.

Aşağıda Jexcel'in kismi sınıf hiyerarşisi var.

Understanding the Excel .xls Binary File Format başlıklı yazıda da Excel'in veriyi nasıl sakladığı anlatılıyor.

XLSX Formatı
XLSX formatı aslında zip dosya formatı ile aynı.Eğer xlsx dosyasını bir zip programı ile açarsak karşımıza aşağıdaki görüntü çıkar.
XSSFSheetXMLHandler sınıfı ile  xml dosyasını parse etmek imkanı var. Bu sınıfın en önemli özelliği her hücreyi String olarak okuyabilmemizi sağlaması.

Excel Hücre Tipleri
Bir hücre aşağıdaki gibi Number olarak görünüyor olsak bile
hücrenin tipi SST_STRING olabiliyor. Bu durumda da string olarak okunabiliyor.

Eğer hücreye format verilmişse
hücrenin tipi NUMBER oluyor. XML içindeki veri 0.22556399999999999 olsa bile


double'a parse edilirken 0.225564 şekline dönüyor. Daha sonra formatlama stringi #,##0.000000 olduğu için java.text.DecimalFormat sınıfı sayesinde Türkçe 0,225564 haline geliyor.


POI ve Number hücrenin sağa/sola dayalı olması
Excel üzerinde 16,466166 görüyoruz ancak xml'de 16.466166000000001 de yazılı.
Eğer hücre sağa dayalı ise xml aşağıdaki gibi
<c r="A1"><v>16.466166000000001</v></c> --> çıktı 16.466166000000001





Eğer hücre sola dayalı ise xml aşağıdaki gibi
<c r="A2" s="1"><v>16.466166000000001</v></c> --> çıktı :  16,466166 çünkü s=1 ile style olarak "general format" kullanıyor

Hiç yorum yok:

Yorum Gönder