1、 需求背景web
在作項目的過程當中,常常會遇到要把數據庫數據導出到Word文件中的需求,由於不少狀況下,咱們須要將數據導出到WORD中進行打印。此需求能夠經過用程序填充數據到word模板中來實現。所謂模板也就是標記了數據位置的Word文件。模板能夠簡單的分爲兩種:一種模板包含了固定的、有限個數的數據位置,好比一個請假條的模板中只有「部門、姓名、緣由、天數、日期」幾個數據位置,也多是這5個數據位置中的某4個、某3個或某1個,但模板中的標籤數量老是這個集合的子集(以下圖所示:);另外一種是包含了循環數據的,好比要生成一個員工信息表,這個表格中有不定個數的員工信息,每一個員工的信息都包含了「編號、部門、姓名、年齡、籍貫」。第一種模板導出word文件相對比較簡單,在本文中先描述此方案的實現方法。數據庫
2、 實現方法spa
1. 編輯模板:模板中必須標記好數據要插入的位置,這樣才能夠實現用程序插入數據到文件的相應位置,就是說要想生成文件,數據的位置必須用某種元素來標記出來。使用PageOffice填充數據到word文件,須要用Word書籤來標記要插入數據的位置。先在Word模板中標記好「部門、姓名、緣由、天數、日期」幾個數據位置:PO_Dept、PO_Name、PO_Cause、PO_Num、PO_Date,以下圖所示:code
通常的開發人員使用Word比較少,可能不清楚Word書籤是怎樣插入的,下面簡單的介紹一下插入書籤的方法。
第一種方法:把光標定位到須要標記數據位置的地方,點Word菜單中的「插入」-「書籤」,就會彈出一個標題爲「書籤」的對話框(以下圖所示),輸入新書籤的名稱,注意:書籤名必須以字母、漢字、中文標點等開頭,能夠包含數字但中間不能有空格(用PageOffice開發的時候不推薦使用中文命名書籤名)。點右側的「添加」按鈕,新的書籤名將出如今下面的列表中。
server
第二種方法:選擇幾個文字、或一段文字、或者選擇一段包含表格和圖片的內容,爲選中的內容指定書籤的對象,而後執行第一種方法的一樣操做,「插入」→「書籤」……
注意:若是新插入位置或新對象採用的是已有的書籤名,原有的書籤將自動取消。對象
PageOffice示例代碼中的模板在製做的時候,多采用第二中方法定義書籤,插入書籤以前會先寫一個標示性的詞語用中括號括起來,好比:[姓名],而後選中「[姓名]」,再插入書籤。這樣作的目的是便於在查看或編輯模板數據位置的時候一目瞭然。blog
在使用PageOffice開發的過程當中,爲了不出現與用戶本身定義的書籤出現衝突,要求插入的書籤名稱必須以「PO_」開頭。注意是字母o,不是數字0。書籤名是不區分大小寫的也能夠寫成「po_」。在PageOffice的概念裏提到的數據區域,本質上就是書籤,可是隻有「po_」開頭的書籤才叫數據區域,請注意這點。接口
2. 編寫代碼調用PageOffice的接口填充數據到word文件中:圖片
// 聲明變量存儲從數據庫中讀取的數據 String docName = "", docDept = "", docCause = "", docNum = "", docDate = ""; // 數據庫數據讀取操做(不一樣的數據庫用不一樣的代碼) ResultSet rs = stmt.executeQuery("select * from leaveRecord where ID = " + id); if (rs.next()) { docName = rs.getString("Name"); docDept = rs.getString("Dept"); docCause = rs.getString("Cause"); docNum = rs.getString("Num"); docDate = rs.getString("SubmitTime"); } rs.close(); //建立PageOffice的WordDocument對象,操做Word文件 WordDocument doc = new WordDocument(); doc.openDataRegion("PO_name").setValue(docName); doc.openDataRegion("PO_dept").setValue(docDept); doc.openDataRegion("PO_cause").setValue(docCause); doc.openDataRegion("PO_num").setValue(docNum); doc.openDataRegion("PO_date").setValue(docDate); //建立PageOfficeCtrl對象打開文件 PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request); poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必須 //獲取數據對象 poCtrl1.setWriter(doc); // 打開文檔 poCtrl1.webOpen("doc/template.doc", OpenModeType.docReadOnly, "Tom");
3、 生成文件的效果開發
4、 示例下載
http://www.zhuozhengsoft.com/down4/Java/BigDemo/poword.rar,或者下載PageOffice for Java的開發包,查看開發包中的示例:3、五、請假條示例