【发布时间】:2013-09-13 20:22:46
【问题描述】:
使用 XSSFWorkbook,是否可以将行附加到现有工作表?我正在执行多次写入(由于错误,这是一个要解决的 PITA),虽然我可以多次写出新工作表,但我似乎无法追加。
我目前正在做的事情如下:
- 阅读我的工作簿的工作表。
- 加载工作簿。
- 将行追加到内存中的工作簿
- 再写一次。
4 似乎不起作用,完全忽略它!
我知道 SXSSFWorkbook 存在,但尝试将我现有的 XSSFWorkbook 转换为流式工作簿会在写入时造成损坏。
有没有可能解决这个难题?
更新:根据建议更改了代码,但出现流关闭错误。
代码:(物理行正确返回,但没有写出)
private void writeToSheetMultipleTimes(SXSSFWorkbook wb,
ReportTemplateStructure appA, File wbFile)
{
Sheet sheet = wb.getSheetAt(0);
log.info("Attempting multi-write to sheet: " + sheet.getSheetName());
for(int i = 0; i < 10; i++)
{
Row row = sheet.getRow(i);
if (row == null) {
row = sheet.createRow(i);
}
Cell cell = row.getCell(0, Row.CREATE_NULL_AS_BLANK);
cell.setCellValue("Written value:" + i);
int numRows = sheet.getPhysicalNumberOfRows();
log.info("Current row count: " + numRows);
try{
XSSFWorkbook xssfBook = (XSSFWorkbook)writeOutAndReadBack(wb);
wb.dispose();
wb = new SXSSFWorkbook(xssfBook);
} catch (Exception e)
{
log.error("Unable to perform multiple write to same sheet", e);
}
}
}
public Workbook writeOutAndReadBack(Workbook wb) {
if(!(wb instanceof SXSSFWorkbook)) {
throw new IllegalArgumentException("Expected an instance of SXSSFWorkbook");
}
Workbook result;
try {
FileOutputStream baos = new FileOutputStream(streamingWorkBookFile);
wb.write(baos);
InputStream is = new FileInputStream(streamingWorkBookFile);
result = new XSSFWorkbook(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
return result;
}
【问题讨论】:
-
POI 附带了大量的单元测试,这些测试按照您的描述进行,并且全部通过而没有问题!我建议您发布一些代码来显示您在做什么,以便我们可以尝试发现您的错误
-
OK 刚刚用代码编辑了它。谢谢!
-
您使用的是什么操作系统? Windows 因对您不小心读取和写入同一个文件而感到不满而臭名昭著。如果你写到不同的文件,它会工作吗?
-
我在 Windows 上,是的。我认为这是 POI。由于我在上面有一个测试方法,可以打开工作簿并在每次后续运行时添加一张工作表 - 但是当我尝试写入同一张工作表时,它突然爆炸了。然而,在这两种方法中我都在写/打开 - 那么有什么区别?虽然我必须说,在第一种方法中,我不使用 SXSSFWorkbook。
标签: apache-poi