系统相关
首页 > 系统相关> > java-使用Poi SXSSFWorkbook向Excel添加注释时使用了过多的内存

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