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

2022-09-03 02:06:54

我在使用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,我需要创建Row()。该表不包含任何行,根据 .getPhysicalRows()、.getFirstRowNum() 和 .getLastRowNum()

谢谢。


答案 1

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

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

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


答案 2

如果要读取或编辑现有行,可以先按类型执行此操作,然后在文件上创建文件基础。
代码如下所示...xssfsxssfxssf

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

推荐