【问题标题】:Convert individual POI SS Sheets to byte[] - Java将单个 POI SS Sheet 转换为 byte[] - Java
【发布时间】:2012-08-20 17:16:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 欢迎来到 SO,埃里克! “..我被卡住了。”

标签: java apache-poi


【解决方案1】:

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

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


警告黑客:一种快速的黑客攻击可能是使用反射来调用受保护的方法。当然,不能保证这将在 POI 的未来版本中起作用。

【讨论】:

    【解决方案2】:

    对于 Excel 文件,有些内容存储在工作表级别,但其他位存储在工作簿级别。当您的用户编辑工作表时,虽然他们的大部分更改将在工作表部分进行,但有些位需要触及工作簿级别的实体,为此您需要整个文件。

    您可能想了解一下 SharePoint 如何进行协作编辑,它允许多人使用 Excel 处理同一个文件,就像 google 文档一样。所有 SharePoint 协议文档都是公开可用的,最近在文档上有一个事件,视频和演示文稿应该很快就会上线,请密切关注 the office interop blog 何时上线。在 SharePoint 文档中,您应该可以找到有关 Microsoft 如何将 Excel 文件分块以进行协作编辑的详细信息,并且您也可以这样做!

    【讨论】:

      【解决方案3】:

      我会考虑考虑将工作表作为单独的 XML 保存在数据库中。如果您在数据库中存储有关属于一起的工作表的其他(元)数据,那么将它们放在一起应该不会太麻烦。使用 XML 的原因是,从 Excel 2003 开始​​,电子表格可以保存为 xml,因此也可以很容易地通过代码创建。

      如果在某一时刻您似乎在使用 Apache POI 时遇到了太多问题,您也可以查看 OpenOffice API。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 2021-05-25
        • 1970-01-01
        • 2014-04-18
        • 2011-06-08
        • 2014-05-04
        • 1970-01-01
        相关资源
        最近更新 更多