1. 程式人生 > >[原創]java導出word的5種方式

[原創]java導出word的5種方式

插入表格 server 聲明 eof 分享圖片 之間 ima 創建 word導出

在網上找了好多天將數據庫中信息導出到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種方式