[原創]java導出word的5種方式
在網上找了好多天將數據庫中信息導出到word中的解決方案,現在將這幾天的總結分享一下。總的來說,java導出word大致有5種解決方案:
1:Jacob是Java-COM Bridge的縮寫,它在Java與微軟的COM組件之間構建一座橋梁。通過Jacob實現了在Java平臺上對微軟Office的COM接口進行調用。
優點:調用微軟Office的COM接口,生成的word文件格式規範。
缺點:服務器只能是windows平臺,不支持unix和linux,且服務器上必須安裝微軟Office。
2:Apache POI包括一系列的API,它們可以操作基於MicroSoft OLE 2 Compound Document Format的各種格式文件,可以通過這些API在Java中讀寫Excel、Word等文件。
優點:跨平臺支持windows、unix和linux。
缺點:相對與對word文件的處理來說,POI更適合excel處理,對於word實現一些簡單文件的操作湊合,不能設置樣式且生成的word文件格式不夠規範。
3:Java2word是一個在java程序中調用 MS Office Word 文檔的組件(類庫)。該組件提供了一組簡單的接口,以便java程序調用他的服務操作Word 文檔。 這些服務包括: 打開文檔、新建文檔、查找文字、替換文字,插入文字、插入圖片、插入表格,在書簽處插入文字、插入圖片、插入表格等。
優點:足夠簡單,操作起來要比FreeMarker簡單的多。
缺點:沒有FreeMarker強大,不能夠根據模版生成Word文檔,word的文檔的樣式等信息都不能夠很好的操作。
4:FreeMarker生成word文檔的功能是由XML+FreeMarker來實現的。先把word文件另存為xml,在xml文件中插入特殊的字符串占位符,將xml翻譯為FreeMarker模板,最後用java來解析FreeMarker模板,編碼調用FreeMarker實現文本替換並輸出Doc。
優點:比Java2word功能強大,也是純Java編程。
缺點:生成的文件本質上是xml,不是真正的word文件格式,有很多常用的word格式無法處理或表現怪異,比如:超鏈、換行、亂碼、部分生成的文件打不開等。
5:PageOffice生成word文件。PageOffice封裝了微軟Office繁瑣的vba接口,提供了簡潔易用的Java編程對象,支持生成word文件,同時實現了在線編輯word文檔和讀取word文檔內容。
優點:跨平臺支持windows、unix和linux,生成word文件格式標準,支持文本、圖片、表格、字體、段落、顏色、超鏈、頁眉等各種格式的操作,支持多word合並,無需處理並發,不耗費服務器資源,運行穩定。
缺點:必須在客戶端生成文件(可以不顯示界面),不支持純服務器端生成文件。
綜合以上資料的參考,和網上的一些意見,最後選擇了,第5種用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");
生成的文件效果:
[原創]java導出word的5種方式