通过Apache POI读取大型Excel文件(xlsx)时出错

jamesT:

我正在尝试通过Apache POI读取大型Excel文件xlsx,例如40-50 MB。我的内存不足异常。当前的堆内存为3GB。

我可以阅读较小的excel文件,没有任何问题。我需要一种方法来读取大型excel文件,然后通过Spring excel视图将它们作为响应返回。

public class FetchExcel extends AbstractView {


    @Override
    protected void renderMergedOutputModel(
            Map model, HttpServletRequest request, HttpServletResponse response) 
    throws Exception {

    String fileName = "SomeExcel.xlsx";

    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

    OPCPackage pkg = OPCPackage.open("/someDir/SomeExcel.xlsx");

    XSSFWorkbook workbook = new XSSFWorkbook(pkg);

    ServletOutputStream respOut = response.getOutputStream();

    pkg.close();
    workbook.write(respOut);
    respOut.flush();

    workbook = null;                    

    response.setHeader("Content-disposition", "attachment;filename=\"" +fileName+ "\"");


    }    

}

我首先开始使用,XSSFWorkbook workbook = new XSSFWorkbook(FileInputStream in);但是每个Apache POI API的使用成本很高,因此我改用OPC封装方式,但效果仍然相同。我不需要解析或处理文件,只需阅读并返回它即可。

GreyBeardedGeek:

您没有提及是否需要修改电子表格。

这也许很明显,但是如果您不需要修改电子表格,那么就不需要解析它并将其写回去,您可以简单地从文件中读取字节并写出字节,就像使用,例如图片或其他任何二进制格式。

如果确实需要在将电子表格发送给用户之前进行修改,那么据我所知,您可能必须采用其他方法。

我知道的用于读取Java中Excel文件的每个库都将整个电子表格读取到内存中,因此,对于每个可能被并发处理的电子表格,您必须拥有50MB的可用内存。正如其他人指出的那样,这涉及调整VM可用的堆。

如果您需要同时处理大量电子表格,并且无法分配足够的内存,请考虑使用可以流式传输的格式,而不是一次将所有内容读取到内存中。可以通过Excel打开CSV格式,过去,通过将内容类型设置为application / vnd.ms-excel,将附件文件名设置为以“ .xls”结尾的文件,但实际上返回了CSV,我取得了很好的效果内容。我已经两年没有尝试过了,所以YMMV。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Apache POI 4.1.1从Excel文件读取值时出错

通过apache POI上传xlsx文件时如何修复AbstractMethodError

通过apache poi读取excel文件(在classpath中)

如何用Apache POI读取.xlsx文件?

读取xlsx文件行时的Apache POI ClassCastException

Apache POI生成的xlsx文件大小大于通过Microsoft Excel手动创建的文件大小

通过与Java结合使用Apache POI创建excel(.xlsx)文件后,文件已损坏

如何使用Apache POI加载大型xlsx文件?

使用Java Apache POI 3.9 Eclipse从Excel文件.xlsx中读取

使用Apache POI从Java中的xls和xlsx excel文件读取和写入

使用Apache POI库从Excel(xlsx)文件读取会引发NullPointerException

通过OpenXML读取大型Excel文件

无法使用Apache POI从Excel文件读取

使用Apache POI读取xlsx文件时出现异常(org.apache.poi.openxml4j.exception-无内容类型[M1.13])?

使用Apache POI读取数值表格Excel文件时出现问题

使用Apache POI在Java中读取/写入Excel文件时出现问题

NumberFormatException:对于输入字符串:尝试使用 apache poi 读取 excel 文件时的“null”

Apache POI将txt文件读取为Excel文件

使用Apache POI通过流/分页策略将xlsx文件解析为大块

写入XLS文件时出错-Apache POI多线程

使用Apache Poi读取复杂的xlsx

使用Apache POI API从Excel文件中读取值

尝试使用POI Apache库读取Excel文件

Apache POI-读取会修改Excel文件

如何使用 Apache POI 读取 MS excel 文件?

从 Apache poi java 读取 Excel

使用Apache POI获取大型Excel文件的Excel工作表名称

使用Apache POI读取XLSX时主线程中出现NoSuchMethodError

是否可以使用Apache POI读取.xls和.xlsx文件?