1、在開發OA辦公或與文檔相關的Web系統中,不免會遇到動態生成word文檔的需求,爲了解決工做中遇到導出word文檔的需求,前一段時間上網找了一些資料,在word導出這方面有不少工具可使用,jacob、poi、java2word、itext。jacob要求服務器必須是windows操做系統,服務器上還必須安裝office軟件,果斷放棄!poi須要針對doc和docx兩種格式寫不一樣的代碼,增長了程序的複雜度。java2doc 是對 jacob 的封裝,一樣放棄!最後選定了用itext來導出word,網上一些資料說itext導出word功能太簡單,經過試用以後,封裝工具類,使用起來確實挺方便,可是導出的word文檔在細節方面很難達到要求,好比:字體、行距、字體間距、首行縮進等。java
2、因爲itext導出的word有各類各樣的小問題,只能另找其餘的解決方案,通過一個朋友推薦,可用PageOffice組件來導出word,其效果能與用戶需求的word文檔達到完美的一致,並且編程接口簡單,調用很方便。總的來講就是製做模板(用PO_開頭的書籤做爲數據佔位符),而後編程調用PageOffice接口用真實數據替換模板中的佔位符,最後生成word。下面看例子:web
1. 製做模板數據庫
打開word模板插入書籤:PO_Dept、PO_Name、PO_Cause、PO_Num、PO_Date,以下圖所示編程
2. 編寫代碼windows
調用PageOffice接口,給word模板填充數據生成word文檔:服務器
1 // 聲明變量存儲從數據庫中讀取的數據 2 String docName = "", docDept = "", docCause = "", docNum = "", docDate = ""; 3 // 數據庫數據讀取操做(不一樣的數據庫用不一樣的代碼) 4 ResultSet rs = stmt.executeQuery("select * from leaveRecord where ID = " + id); 5 if (rs.next()) { 6 docName = rs.getString("Name"); 7 docDept = rs.getString("Dept"); 8 docCause = rs.getString("Cause"); 9 docNum = rs.getString("Num"); 10 docDate = rs.getString("SubmitTime"); 11 } 12 rs.close(); 13 //建立PageOffice的WordDocument對象,操做Word文件 14 WordDocument doc = new WordDocument(); 15 doc.openDataRegion("PO_name").setValue(docName); 16 doc.openDataRegion("PO_dept").setValue(docDept); 17 doc.openDataRegion("PO_cause").setValue(docCause); 18 doc.openDataRegion("PO_num").setValue(docNum); 19 doc.openDataRegion("PO_date").setValue(docDate); 20 //建立PageOfficeCtrl對象打開文件 21 PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request); 22 poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必須 23 //獲取數據對象 24 poCtrl1.setWriter(doc); 25 // 打開文檔 26 poCtrl1.webOpen("doc/template.doc", OpenModeType.docReadOnly, "Tom");
3. 生成效果圖工具
3、 源碼下載字體
https://download.csdn.net/download/zi_wu_xian/10399345操作系統