当前位置: 首页 > 面试题库 >

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

於德馨
2023-03-14
问题内容

我正在尝试通过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封装方式,但效果仍然相同。我不需要解析或处理文件,只需阅读并返回它即可。


问题答案:

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

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

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

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

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



 类似资料:
  • 我在用图书馆 我在努力 库,但无法将其转换为工作簿 注意:在最终结果中,我希望返回XSSFWorkbook 上面的代码会内存溢出,任何帮助都将提前感谢

  • 我正在写一个程序,它需要从excel文件中读取和写入数据,而不考虑格式(xls或xlsx)。 我知道ApachePOI,但它似乎有不同的类来处理xls文件(HSSF)和xlsx(XSSF)文件。 任何人都知道我将如何实现我在这里的目标。(也欢迎使用POI以外的API的想法)。

  • 本文向大家介绍通过openpyxl读取excel文件过程解析,包括了通过openpyxl读取excel文件过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了通过openpyxl读取excel文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1、环境准备 python3环境、安装openpyxl模块 2、excel文件数

  • 该编码能够读取excel文件中的小数据...但不读取excel文件中的大数据文件....如何进一步修改代码?

  • 问题内容: 我正在尝试读取(使用apache poi).xlsx文件,该文件不在文件系统中,但在类路径中。我正在使用Maven-因此它位于资源文件夹中。 我的代码是- 我收到此例外。 当我从文件系统读取同一文件时,一切都很好。我的代码中有错误吗?还是想念一些东西? UPDATE1:这是在Web应用程序中,因此代码已部署在tomcat 7中。 UPDATE2:当我以这种方式读取同一文件时,它可以工作

  • 我正在使用Java开发一个web应用程序,在这里我有一个方法可以读取。使用apache poi的xlsx文件: 该方法工作正常,但是该方法处理具有数千行记录的文件的可能性有多大,例如,大约2530万行。当处理一个大文件时,我采取以下异常: 我需要知道如何避免这种错误。例如,如果有,请读取并处理该文件。xlsx 1000至1000线,或其他解决方案。