需求背景html
在互聯網教育行業,作內容相關的項目常常碰到的一個問題就是如何動態生成一張word試卷。事先把題庫中的每一道試題都已經保存成一個獨立的word文件了,可是在選擇了部分試題生成一張word試卷的時候,若是不能經過java程序來合併已經選擇了的word試題文件,那麼就只能經過手動錄入和拷貝的方式來合併word內容,效率低下,並且人工成本和錄入出錯率都較高。java
問題難點web
使用POI來實現word合併須要面對的困難主要有如下幾個方面:數據庫
word 結構問題 —— word不開源,且含有不少非文本內容,好比圖表、圖片,而已知的常規方法只能解析純文本內容,因此若是不知道word內部層級結構,解析將難以進行。
word 版本問題 —— 目前word有docx和doc兩種文檔格式,解析是否要所有兼容?固然,前提是已經成功解析一種類型。
word 規範問題 —— 有些word多是早期製做的,返工代價太大,因此格式內容多樣化。並且就算制定word格式規範,新制做的word也沒法保證格式必定正確。
使用Jacob來實現word文檔合併要面對的問題:服務器
服務器必須是Windows操做系統 —— 目前之因此web項目多用Java開發,就是由於服務器能夠是Linux、Unix等非Windows的系統來下降項目的成本。
服務器上必須安裝Office —— Jacob的意思就是: Java COM Bridge,java中調用office提供的com接口來實現對Office文件的操做。
併發問題 —— 若是多用戶同時在線生成word文件就必須處理此併發問題,稍有不慎,就會在服務器端產生Office的死進程,死鎖服務器的內存資源。
解決方案併發
問題研究一段時間後,進展緩慢,在反覆百度的過程當中發現PageOffice提供了很好的解決方案,而且在PageOffice的示例程序中就有相關的演示,只不過PageOffice的演示示例是把word文件以二進制流的形式保存在數據庫中,只須要在本身的項目中改成用磁盤文件的方式保存word文件就能夠了。PageOffice方案採用了調用客戶端Office接口進行word文檔合併,這樣就同時解決了word格式問題、版本問題、規範問題和多用戶的併發問題,對服務器端也沒有任何要求,堪稱完美。app
PageOffice for Java的開發包下載地址:http://www.zhuozhengsoft.com/dowm/ ,拷貝解壓出來的 Samples4 文 件 夾 到 Tomcat 的 Webapps 目 錄 下 , 訪 問 : http://localhost:8080/Samples4/index.html,查看綜合演示: 3、二、在Word文檔中動態生成一張試卷ide