- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
几年前,我遇到了使用 jXLS
和 POI XSSF
创建大型 excel 文件的问题。如果我没记错的话,我认为 XSSF
会在磁盘上创建类似 1GB+ 的临时文件来创建 10mb 的 excel 文件。所以我停止使用 jXLS
而是使用 SXSSF
来创建 excel 文件,但今天我有了使用 jXLS
或 JETT 的新理由
。
jXLS
和 JETT
网站似乎都暗示性能要好得多,但是 POI
的 XSSF
网站仍然笼统地说 XSSF
需要更高的内存占用。我想知道现在这种更高的内存占用是否相当于合理的 10% 开销,或者它是否仍然像几年前那样的 10,000% 开销。
POI 3.9 XSSF
是否修复了疯狂的内存问题?我是否应该担心将它与 jXLS
或 JETT
一起使用?或者是否有某些陷阱需要避免?我对重复使用单元格样式很谨慎。
最佳答案
要回答您的问题,是的,POI 在处理大型 XLSX 文件时总是会使用非常大量的内存,这比 XLSX 文件的大小大得多。我认为这不会很快改变,并且有很明显的原因:XLSX 基本上是一堆压缩的 XML 文件,并且 XML 压缩得很好(大约 10 倍)。将此 XML 不压缩地放在内存中就已经将内存消耗增加了十倍,因此如果您添加数据结构的所有开销,您不可能期望内存消耗比 XLSX 文件大小增加 10%。
现在,好消息是,如评论中所述,Apache POI 引入了 SXSSF用于在电子表格中流式传输非常大量的数据,具有非常好的性能和低内存使用率。以这种方式生成的 XLSX 文件仍然在硬盘上流式传输,它们最终可能会占用相当多的空间,但至少您不会在写入数十万行时冒 OOME 的风险。
您的问题是您无法让 JETT 直接使用 SXSSF,因为它需要将整个文档加载到内存中才能执行模板填充。 JETT作者快速讨论了这个话题here .
我有同样的问题,最后做了一个两步的 XLSX 创建:
用于生成 header 和格式的标准 JETT XLSX 模板。第一张表的最后一行包含带有 $$tokens$$ 的单元格,每个单元格一个。我不使用 JETT 插入大量行。
JETT 完成工作后,我重新打开工作簿,阅读然后删除第一个电子表格最后一行的 $$tokens$$,并开始使用 SXSSF 逐行传输数据。
当然,这种方法也有局限性:- 在行插入期间,您不能在任何流式处理行上使用 JETT(但您之前可以,例如动态选择 $$tokens$$ 的顺序)- 除非您使用 POI API 自行处理,否则不会复制单元格格式。我个人更喜欢在我的 XLSX 文件中格式化整个列,它将应用于流式数据。
如果您想使用通过 SXSSF 插入的数据显示图表,这也适用:您可以使用函数 OFFSET 和 COUNTA 定义一个命名范围,然后创建一个数据透视表和数据透视图,当在 Excel 中打开 XLSX 时,这些数据透视表和数据透视图将被刷新。
关于java - POI XSSF 是否仍然存在疯狂的错误内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21488738/
在 MySQL 8.0.21 上,我有一个空表 ( Tbl ),只有一列: num , 类型 float . 我插入一行,值为 0.1 : INSERT INTO Tbl(num) VALUES(0.
我一直在阅读 Swing 教程“如何使用表”,尽管它对 JTable 新手来说提供了很多信息,但我在尝试转向时立即遇到了障碍示例并自行解决。 因此,如果您希望您的 Swing 应用程序拥有漂亮的自定义
首先,请原谅,因为我对这个有点陌生,所以我的代码看起来不太漂亮......但下面的一切都有效,## 这不是一个寻求非工作代码帮助的线程##. 现在那已经不碍事了……事情是这样的:我已经为 FF 制作了
我已将 1-1 这段代码从 C++/OpenGL 移植到 C# SharpGL: float[] cameraAngle = { 0, 0, 0 }; float[] cameraPo
背景: 我在一台旧笔记本电脑上运行。我总共只有 512Mo 可用 128Mo ram。没钱买更多的 ram。 我使用 mmap 来帮助我规避这个问题,而且效果很好。C代码。Debian 64 位。 问
这是一个奇怪的。 重命名类后,我的一个表单开始在设计器中出现错误,拒绝打开。有趣的是,当我运行该程序时,该表单运行良好。 我开始恢复我的更改以推断问题所在。我现在已经完全恢复到上次提交 - 我知道表单
我有一个项目列表,上面有不同的事件处理程序。 ... Item ... Add to list A Add to list B
我有一个静态 View ,它是一个设置 View 。它有 3 个部分 section 1 has 3 rows section 2 has 1 row section 3 has 1 row 我在每一
我大概花了一个月的时间在互联网上研究这个问题,但还没有找到答案。我的代码执行以下操作(所有 Javascript)。 假设我在 mydomain.com 上有一个 test.html 首先在 head
谁能解释一下 prototype.init 函数在 JavaScript 中的意义以及它在对象实例化过程中何时被调用? 为什么要用空函数覆盖它? 我正在阅读 JavaScript for Web 这本
我喜欢 MVVM。我不喜欢它,但喜欢它。其中大部分是有道理的。但是,我一直在阅读鼓励您编写大量代码的文章,这样您就可以编写 XAML 而不必在代码隐藏中编写任何代码。 我举个例子。 最近我想将我的 V
我遇到了一个问题,我确信许多新/初级 Web 开发人员都面临着这个问题。在陈述问题之前,最好先列出导致我出现“问题”的事件。 第 1 步 - 前端:我遵循的教程允许我使用 vue-cli 创建一个 V
所以,我做了很多搜索和摆弄,但找不到解决方案。也许我的情况很独特——或者更有可能我只是不知道我到底在做什么。我比刚开始时更接近了,所以这令人振奋。不管怎样 - 我们来了智囊团 - 非常感谢任何帮助。
iTunes connect 一直拒绝我的二进制文件进行应用程序更新,这让我发疯。通常我可以弄清楚,但我已经尝试了我能想到的一切。也许有人可以伸出援助之手:) 我得到的错误是: The binary
嗯,George Boole 的骨架一定在它的坟墓里感到有些疼痛,因为我的 bool 人刚刚变得疯狂并开始举办派对。我真的认为他们想反抗我。 现在更严重了:可能我在 $watch 方法中遗漏了一些东西
我有一个ul、链表元素和无链接的li。 Home Test1 second_level
为此搜索了答案,但找不到任何内容。我能找到的最接近的是 difftime returning 0 when there is clearly a difference其中有一个很好的解释,与如何将参数
Closed. This question is opinion-based。它当前不接受答案。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
所以...我的问题有点奇怪。我有一个简单的 UIToolbar 被添加到在 viewDidLoad 时间调用的 navigationController 的 View 层次结构中。听起来很简单,对吧?
我是一名优秀的程序员,十分优秀!