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

时间:2011-06-29 14:18:53

标签: java apache-poi

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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


警告黑客:一个快速入侵可能是使用反射来调用受保护的方法。当然不能保证这将在POI的未来版本中有效。

答案 1 :(得分:1)

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

您可能希望了解SharePoint如何进行协作编辑,这使得使用Excel的几个人可以像google docs一样处理同一个文件。所有SharePoint协议文档都是公开可用的,并且最近有一个关于视频和演示文稿应该很快联机的文档上的事件,请关注它们the office interop blog的时间。在SharePoint文档中,您应该找到有关Microsoft如何对Excel文件进​​行协作编辑的详细信息,并且还有一些内容可以为您做同样的事情!

答案 2 :(得分:0)

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

如果您在某个时刻似乎用Apache POI打了太多墙,那么您也可以查看OpenOffice API。