2011-06-29 54 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文件分塊以進行協作編輯的詳細信息,並且您也可以這樣做!