逐个单元格复制Excel数据

时间:2018-01-10 20:52:08

标签: java apache apache-poi

我有一个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文件。

1 个答案:

答案 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);`
  • 使用流API来读取大文件 POI提供了一个样本来实现它,XLSX2CSV
  

用于读取非常大的文件,看一下XLSX2CSV中的示例   展示了如何以流媒体方式阅读文件

您还可以使用event API

  

适用于愿意学习的中级开发人员   一点点的低级API结构。它比较简单   使用,但需要基本了解Excel文件的各个部分   (或愿意学习)。提供的优势是你可以阅读   一个内存占用相对较小的XLS。

POI提供多个Event API:简单,记录Aware Event API,基于SAX的API 但请注意,所有这些流媒体方式都依赖于事件编程 因此,它可能会给处理带来一些复杂性。