【问题标题】:Copying Excel data cell by cell逐个单元格复制Excel数据
【发布时间】:2018-01-10 20:52:08
【问题描述】:

我有一个 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宝。所以我的基本要求是将所有 excel 表数据逐个单元格复制到另一个 excel 文件中。

【问题讨论】:

    标签: java apache apache-poi


    【解决方案1】:

    几个月前有人问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。
    但请注意,所有这些流式传输方式都依赖于事件编程。
    所以它可能会在处理过程中带来一些复杂性。

    【讨论】:

    • 谢谢 .. 我想如果我可以将我的 excel 表的内容逐行复制到另一个新的 excel 表中。这样可以消除图表。那会很棒。
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多