java-使用Poi SXSSFWorkbook向Excel添加注释时使用了过多的内存
作者:互联网
我的应用程序创建了一个电子表格,该电子表格可能很大(最多500,000行,每行分布在六张纸上,每行约20列).
我使用Apache Poi,然后转而使用SXSSFWorkBook来将数据写入临时文件,以使所使用的内存与最终电子表格的大小不成比例,并且效果很好.
但是电子表格表示元数据已更改,并且当元数据已更改时,我想在显示旧值的单元格中添加注释.我可以在小型电子表格中使用它,但是在尝试大型文件时,它总是会因堆内存错误而失败.
我不确定问题是由于Poi将所有评论存储在内存中的限制还是我做错了.工作表是我自己的包装器类,每张纸只创建一个DrawingPatriach类,但是看起来我必须为所需的每个注释创建一个锚点.
private void addCellComment(Row r, Cell c, Worksheet sheet, String value)
{
String formattedValue = value.replace('\u0000', '\n');
int rowCount = value.split("\\\\u000").length;
ClientAnchor anchor = factory.createClientAnchor();
anchor.setCol1(c.getColumnIndex());
anchor.setCol2(c.getColumnIndex()+2);
anchor.setRow1(r.getRowNum());
anchor.setRow2(r.getRowNum()+rowCount);
Drawing drawing = sheet.getDrawing();
Comment comment = drawing.createCellComment(anchor);
RichTextString str = factory.createRichTextString(formattedValue);
comment.setString(str);
c.setCellComment(comment);
}
解决方法:
好吧,从Apache POI documentation起(重点是我的):
Please note that there are still things that still may consume a large amount of memory based on which features you are using, e.g. merged regions, hyperlinks, comments, … are still only stored in memory and thus may require a lot of memory if used extensively.
因此,我想这是Apache POI的局限性,您必须解决此问题.
标签:apache-poi,java 来源: https://codeday.me/bug/20191111/2020847.html