Apache POI getRow()返回null,.createRow失败

我使用Apache POI v3.12有以下问题:我需要使用一个包含49行[0..48]的XLSX文件作为模板,用数据填充它的单元格,并将其写为另一个文件,以便可以重用再次模板。 我所做的大概是这样的:

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); 

/ 稍后的/

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

debugging后发现getRow()返回null,但是尝试.createRow()失败:

 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) ... 

我在这里错过了什么吗? 据我已阅读的Apache文档和论坛,如果getRow()返回null,我需要createRow()。 根据.getPhysicalRows(),.getFirstRowNum()和.getLastRowNum(),表单不包含任何行。

谢谢。

请参阅将XSSFWorkbook作为参数的SXSSFWorkbook构造函数的文档。 您无法覆盖或访问模板文件中的初始行。 您正试图覆盖现有的行,并且API不支持此行。 你的exception信息反映了这一点

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

对于你的用例,你可能想尝试http://jxls.sourceforge.net