我有一个spring boot应用程序,它读取用户上传的excel表数据,并为excel数据生成json。当excel很大~3-8 MB(它也有图表)我得到以下错误。
018-01-09T19:42:34.21+0530 [App/0] OUT 2018-01-09 14:12:34.212 ERROR 29 --- [io-63936-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Direct buffer memory] with root cause
2018-01-09T19:42:34.21+0530 [App/0] OUT java.lang.OutOfMemoryError: Direct buffer memory
2018-01-09T19:42:34.21+0530 [App/0] OUT at java.nio.Bits.reserveMemory(Bits.java:694) ~[na:1.8.0_152]
2018-01-09T19:42:34.21+0530 [App/0] OUT at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123) ~[na:1.8.0_152]
2018-01-09T19:42:34.21+0530 [App/0] OUT at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) ~[na:1.8.0_152]
2018-01-09T19:42:34.21+0530 [App/0] OUT at sun.nio.ch.IOUtil.read(IOUtil.java:195) ~[na:1.8.0_152]
由于文件变得太大,因为它已经获得图表数据我想将文件复制到另一个没有图表数据的excel文件然后处理它。任何人都可以帮助我如何使用apache来做到这一点POI。所以我的基本要求是将所有excel表数据逐个单元格复制到另一个excel文件。
答案 0 :(得分:0)
几个月前有人问enough close question:“如何使用apache POI从Excel中删除图表?”。
不幸的是,没有答案。
说实话,我并不确切如何删除图表 但是我可以给你两个想法来解决你的问题:
例如删除标签:
HSSFSheet sheet = workbook.getSheet("chartSheet");
if(sheet != null) {
workbook.removeSheetAt(workbook.getSheetIndex(sheet));
}
FileOutputStream output = new FileOutputStream(copyFile);
workbook.write(output);`
用于读取非常大的文件,看一下XLSX2CSV中的示例 展示了如何以流媒体方式阅读文件
您还可以使用event API:
POI提供多个Event API:简单,记录Aware Event API,基于SAX的API 但请注意,所有这些流媒体方式都依赖于事件编程 因此,它可能会给处理带来一些复杂性。适用于愿意学习的中级开发人员 一点点的低级API结构。它比较简单 使用,但需要基本了解Excel文件的各个部分 (或愿意学习)。提供的优势是你可以阅读 一个内存占用相对较小的XLS。