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

我正在尝试通过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。

以上是 通过Apache POI读取大型Excel文件(xlsx)时出错 的全部内容, 来源链接: utcz.com/qa/418015.html

回到顶部