Java-使用大型Excel进行读取,处理和写入

时间:2018-12-09 08:06:42

标签: java apache-poi

我的床单很大。它有10张纸,每张纸有1m行。使用Java,我需要为每一行运行一个算法,为每一行返回一个值,然后再插入到excel文件中。

我的想法是将文件加载到ram中,对每一行进行计算,将结果存储在列表中,然后按顺序插入到excel中,但是我没有想到处理数据大小的问题。

我尝试了XSSF,但它无法加载如此大的文件。等待了几个小时后,它给了我OOM错误。

我尝试在运行->运行配置->参数以及控制面板-> Java中增加堆。没用。

我尝试使用以下StreamingReader,但无法正常工作。

{ "$group": {
  "_id": "$_id.users",
  "data": {
    "$push": {
      "k": "$_id.source",
      "v": "$bytes"
    }
  }
}},
{ "$project": {
  "_id": 0,
  "username": "$_id",
  "bytes": { "$arrayToObject": "$data" }
}}

我真的很头绪,不知道该怎么办。没有简单的方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:0)

这不仅与该库的配置有关。这也与您为JVM提供的内存有关!尝试增加JVM的堆空间,例如,请参见here

除此之外:我认为您应该做两件事:

  • 使用较小的工作表进行实验。创建一个只有100行,然后可能是10K,100K的行。测量内存消耗。然后从那里
  • 查看是否还有其他API /库允许您无需读取/写入单个行
  • ,如果这些都不起作用,那么也许您必须使用完全不同的设计:例如仅提供某种“服务”。现在,您编写了一些在excel中运行的VB脚本代码,只需针对每一行调用该服务以获取结果。或者,理想情况下:不要将Excel误用作数据库。这类似于使用跑车运输大量货物,只是因为您已经拥有该跑车。但是,取而代之的是让自己更适合卡车。换句话说:考虑将数据移动到真实数据库中。从长远来看,那么您所做的一切都会更加轻松!