Apache POI getRow() returns null 和 .createRow 失败

Apache POI getRow() returns null and .createRow fails

我在使用 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() returns 为空,但尝试 .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() returns null,我需要 createRow()。根据 .getPhysicalRows()、.getFirstRowNum() 和 .getLastRowNum()

,sheet 不包含任何行

谢谢。

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

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

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

如果你想读取或编辑一个存在的行,你可以先在xssf类型中进行,然后在xssf文件的基础上创建sxssf文件。
代码如下所示...

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

请看一下这个构造函数参数

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