gpt4 book ai didi

java - 将单个 POI SS 表转换为 byte[] - Java

转载 作者:行者123 更新时间:2023-12-02 00:40:35 24 4
gpt4 key购买 nike

我正在开发一个内部系统,其工作方式与 Google 文档非常相似。我正在实现的主要部分模仿了他们基于网络的电子表格实现。由于多种原因,我无法使用 Google Docs 或 ZK,它们具有非常强大的电子表格 API。我选择 POI 3.7 作为 Excel 电子表格处理的起点。

目前,当用户上传 Excel 电子表格时,我会获取文件 byte[] 并将其作为 blob 存储在我们的数据库中。当用户想要查看电子表格时,我会取出字节[],构建工作簿,并将其推送到客户端 UI 进行编辑。推送到用户界面不是我关心的。当用户对电子表格进行编辑时,我将编辑内容推送到服务器并将它们存储在堆栈中,并且仅在用户按下“保存”按钮时应用更新。保存时,我将工作簿从数据库中拉出,进行更改并将工作簿推回数据库。这样我就不会把它保留在内存中。毫不奇怪,所有这一切都非常快,除了当多个用户开始这样做时,显然爆炸性的工作簿会消耗内存,如此处其他帖子中所述。

用户一次只能更新一个选项卡,为什么我需要打开整个工作簿?当用户最初上传 Excel 电子表格时,我可以取出每个工作表,将每个工作表转换为 byte[] 并将每个工作表保存为单独的“工作表”数据库记录吗? POI 表有一个 protected “#write(Stream)”方法,但我不想涉足重新编译 POI 的业务。我也不想将每个单元格分解为新的数据库条目。你们一开始会采取不同的做法吗?

后端是java/spring/jdbc。由于内部原因,这些是我一直在使用的技术。

最佳答案

如果性能很重要,那么在数据库中存储大的二进制 blob 本身并不是一件好事。将工作簿存储在磁盘上会更好。

我只能给你问题的一半答案,那就是你可以使用(http://poi.apache.org/apidocs/index.html? org/apache/poi/xssf/eventusermodel/XSSFReader.html),并且您可以使用 SAXParser 来避免将每个完整工作表保留在内存中。我认为没有任何方法可以在不创建工作表对象的情况下保存它。

<小时/>

警告黑客:一种快速黑客可能是使用反射来调用 protected 方法。当然,不能保证这在 POI 的 future 版本中有效。

关于java - 将单个 POI SS 表转换为 byte[] - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6522190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com