使用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(),工作表不包含任何行
感谢。
答案 0 :(得分:9)
请参阅以SXSSFWorkbook
为param的XSSFWorkbook
构造函数的文档。您无法覆盖或访问模板文件中的初始行。您正在尝试覆盖现有行,API不支持此行。您的异常消息反映了这一点
对于您的使用案例,您可能需要尝试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)