2011-06-29 23 views
0

我正在开发一个内部系统,其目的与Google文档非常类似。我正在执行的主要部分模仿他们基于Web的电子表格实现。由于多种原因,我无法使用Google Docs或ZK,它具有非常强大的Spreadsheet API。我选择POI 3.7作为我的Excel电子表格处理的起点。将单个POI SS表转换为字节[] - Java

当前用户上传Excel电子表格时,我将文件byte []存储在我们的数据库中作为blob。当用户想要查看电子表格时,我拉出字节[],构建工作簿,并将其推送到客户端UI进行编辑。推向用户界面并不是我关心的问题。当用户对电子表格进行编辑时,我将编辑推送到服务器并将其存储在堆栈中,并且只在用户按下“保存”按钮时才应用更新。保存时,我将工作簿拉出数据库,进行更改并将工作簿推回到数据库。这样,我不会记住它。毫不奇怪,除了多个用户开始执行此操作之外,所有这些都非常快,显然,Workbooks会像其他帖子中描述的那样使用内存。

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

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

+0

欢迎来到SO,Eric! “我被卡住了。” < - 某种程度上听起来很负面:-) – Wivani

回答

2

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

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


警告哈克:一个快速黑客可以使用反射来调用protected方法。当然不能保证这将在将来的POI版本中起作用。

0

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

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

1

对于Excel文件,有些东西存储在工作表级别,但其他位存储在工作簿级别。当用户编辑工作表时,虽然他们的大部分更改都会显示在工作表部分,但有些位需要触摸工作簿级别实体,因此您需要整个文件。

您可能想看看SharePoint如何进行协作编辑,这可以让几个使用Excel的人在Google文档上工作在相同的文件上。所有的SharePoint协议文档都是公开发布的,最近在文档上发生了一个关于哪些视频和演示文稿应该很快上线的事件,请在时间上关注the office interop blog。在SharePoint文档中,您应该找到有关Microsoft如何将Excel文件分块以进行协作编辑的详细信息,并且您也可以这样做!