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

时间:2015-06-16 13:00:15

标签: java excel apache-poi

使用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);
}

调试后发现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()

,工作表不包含任何行

感谢。

3 个答案:

答案 0 :(得分:9)

请参阅以SXSSFWorkbook为param的XSSFWorkbook构造函数的文档。您无法覆盖或访问模板文件中的初始行。您正在尝试覆盖现有行,API不支持此行。您的异常消息反映了这一点

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

对于您的使用案例,您可能需要尝试http://jxls.sourceforge.net

答案 1 :(得分:1)

如果要读取或编辑存在的行,请首先以xssf类型进行操作,然后在sxssf文件的基础上创建xssf文件。
代码如下所示

XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(file));

//do the read and edit operation with xssf......
......
......

SXSSFWorkbook sXSSFbook = new SXSSFWorkbook(xssfWorkbook); 

//do the write operation with sxssf......
......
......

答案 2 :(得分:0)

请看一下这个构造函数参数 enter image description here

XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(exportExcelTo));
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook, -1, Boolean.FALSE, Boolean.TRUE);