2015-06-16 4 views
11

Ich habe das folgende Problem mit Apache POI v3.12: Ich brauche eine XLSX-Datei mit 49 Zeilen [0..48] als Vorlage, füllen Sie es Zellen mit Daten und schreibe es als eine andere Datei aus, damit ich die Vorlage wiederverwenden kann. Was ich tue, ist etwa so:Apache POI getRow() gibt null zurück und .createRow schlägt fehl

XSSFWorkbook wbk_template = new XSSFWorkbook(new FileInputStream (f_wbk_template)); 
SXSSFWorkbook wbk = new SXSSFWorkbook(wbk_template, 50, true); 

Sheet sheet = wbk.getSheet(STR_SHEET_NAME); 

/später/

Row row = sheet.getRow(rownum); 
if (null == row) { 
    row = sheet.createRow(rownum); 
} 

Beim Debuggen es stellt sich heraus, dass getRow() gibt null, aber der Versuch, .createRow() scheitert mit:

java.lang.IllegalArgumentException: Attempting to write a row[2] in the range [0,48] that is already written to disk. 
    at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:122) 
... 

fehle ich hier etwas? Soweit ich in den Apache-Dokumenten und -Foren gelesen habe, muss ich createRow() erstellen, wenn getRow() null zurückgibt. Das Blatt enthält keine Zeilen gemäß .getPhysicalRows(), .getFirstRowNum() und .getLastRowNum()

Vielen Dank.

+0

Warum verwenden Sie SXSSFWorkbook für diesen Fall? Warum nicht einfach nur XSSFWorkbook für eine Datei dieser Größe verwenden? – Gagravarr

+0

Ja Gagravarr, ich habe festgestellt, dass Streaming-Interfaces nicht in der Lage sind, das zu tun, was ich wollte. Ich habe meinen Code bereits geändert und alles funktioniert wie erwartet. Vielen Dank. –

Antwort

6

Siehe Dokumentation für den SXSSFWorkbook-Konstruktor, der die XSSFWorkbook als Parameter verwendet. Sie können die ersten Zeilen in der Vorlagendatei nicht überschreiben oder auf sie zugreifen. Sie versuchen, eine vorhandene Zeile zu überschreiben, und die API unterstützt dies nicht. Ihre Ausnahmebedingungsnachricht spiegelt dies wider.

https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html#SXSSFWorkbook(org.apache.poi.xssf.usermodel.XSSFWorkbook)

Für Ihren Anwendungsfall, können Sie http://jxls.sourceforge.net ausprobieren möchten.

+0

Danke IceMan. Dies erklärt das Verhalten, das ich erlebe. Danke für den Link zu jxls - ich werde es versuchen. Ich wusste nicht, dass Apache POI diese Funktionalität fehlt. –

+0

Wenn Sie die Vorlagendatei beibehalten und sie nicht überschreiben möchten, verwenden Sie jxls, vorausgesetzt, Sie haben die Flexibilität, dies zu tun. Sie können dies auch mit Apache POI tun, ohne die Streaming-Arbeitsmappen-API zu verwenden. – IceMan

+0

Ich versuche bereits, die jxl-Bibliothek zugunsten von Apache POI loszuwerden, also möchte ich nicht wirklich eine andere Excel-Zugriffsbibliothek einführen. Kannst du mir Hinweise geben, wie man dieses Ziel mit Apache POI erreichen kann, oder sollte ich eine andere Frage speziell dafür öffnen? Vielen Dank. –