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 不支持此操作。您的异常消息反映了这一点。
对于您的用例,您可能想尝试 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);
我在使用 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 不支持此操作。您的异常消息反映了这一点。
对于您的用例,您可能想尝试 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);