天天看點

Word動态輸出多表格方案(以工資條為例)

1、功能介紹

         PageOffice能實作在Word文檔中動态循環輸出多個相同格式的表格并在表格的單元格中動态填充資料。

         在Word文檔中使用表格時,有時可能會需要生成多個具有相同格式的表格,例如某大公司需要生成多名員工的工資單、體檢中心要生成多名體檢人員的體檢報告等。若是這些表格的數量不是太多并且表格中的單元格資料相同的話,那麼隻需多複制幾份就可。可若是這些表格的數量很大需要幾百幾千甚至更多且需要從資料庫中讀取資料記錄寫入表格的單元格中的話可就不那麼容易實作了。這些表格中的資料若是逐一地靠手動錄入,不僅效率非常低,而且手動輸入的錯誤率亦會很高。而若想既提高工作效率又降低錯誤率那最好的辦法當然就是通過程式實作了。

         通過PageOffice的資料區域(即DataRegion類)就能高效地實作在Word中動态循環輸出多個相同格式和樣式的表格,且能将資料庫中的資料記錄全部正确的動态填寫到表格中。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

什麼是資料區域?資料區域是Word文檔中具有 "PO_" 字首命名的書簽所定位的文檔區域。簡單來說,資料區域就是一種特殊的Word書簽對象,便于定位Word文檔中的内容。資料區域是PageOffice開發平台中重要的技術概念。

這裡舉個簡單的例子說明什麼是資料區域:假設開發者需要在待打開的Word文檔指定位置處顯示産品名稱,就可以先手動打開此Word文檔,在指定位置處插入書簽"PO_ProductName",儲存文檔。這樣資料區域"ProductName"就定義好了。編寫代碼 doc.OpenDataRegion("ProductName").Value ="PageOffice"; 即可在此資料區域處生成想要的内容。

資料區域的填充及資料區域格式的控制都是通過DataRegion類實作的,很多Word操作都需要調用DataRegion類完成。DataRegion類能通過調用 OpenDataRegion(String) 方法或CreateDataRegion(String, DataRegionInsertType, String) 方法獲得 DataRegion 對象。

         PageOffice要實作在Word文檔中動态輸出多個相同格式的表格很容易。下面以輸出多個工資條為例來描述具體的實作方法。首先在一個Word文檔中設定好所要輸出的工資條資料表格的樣式和格式,将其作為模版文檔,命名為“template.doc”;然後建立一個空白的Word檔案,用來輸出多個工資條表格,命名為“test.doc”;再通過程式讀取資料庫中的相應資料,按讀取的記錄資料進行循環,在循環時建立資料區域,将模版“template.doc”指派給每次建立的資料區域,并向表格中填充資料,最後線上打開“test.doc”文檔,即可在其上動态輸出多個工資條表格。

2、Word動态輸出多表格(以工資條為例)具體實作方法

         PageOffice開發平台下,Word動态輸出多個工資條表格的具體實作過程很簡單,隻需要将PageOfficeCtrl控件類、WordDocument類、DataRegion類結合Table類使用即可實作這一功能。

         在Word中動态生成多個工資條的具體實作步驟如下:

         ①先在一個Word文檔中設定好要輸出的工資條表格的樣式和格式做成Word模版,将其命名為“template.doc”。

         ②建立一個空白的Word文檔,用來在其中輸出多個工資條表格,将其命名為“test.doc”。

         ③根據查詢條件,通過程式擷取員工工資資訊,再循環讀取員工的工資資訊,并在每次循環時都調用DataRegion類的CreateDataRegion(string NewDataRegionName, DataRegionInsertTypeInsertType, string RelativeDataRegionName)方法建立一個資料區域,将模版“template.doc”文檔作為值指派給該資料區域,然後再将員工的工資資訊動态填入表格的單元格中。

         資料區域值的類型可以是文本類型、Word檔案類型、Excel檔案類型、圖檔類型等。一般将Word、Excel、圖檔類型的值指派給資料區域時,寫法為:“[word]word檔案路徑[/word]”、“[excel]excel檔案路徑[/excel]”、“[image]image圖檔路徑[/image]”。此示例中為實作動态生成多個表格是将Word檔案類型的值指派給資料區域。

         PageOffice标準版隻支援文本類型,專業版隻支援文本、圖檔和Word檔案類型,企業版文本、Word檔案、Excel檔案、Image圖檔類型都支援。使用時請一定要注意。

     資料區域的具體使用方法和調用請參見相應開發語言的開發幫助和開發示例包中的示例。

         ④調用PageOfficeCtrl類對象的WebOpen(Stringfilename,OpenModeType type, String userName)方法打開Word檔案“test.doc”,在“test.doc”文檔中動态輸出和顯示多個工資條表格。

         PageOffice開發平台下,Word動态輸出多個工資條表格的具體實作代碼如下:

         //Java實作代碼

         //從資料庫中讀取工資條資訊

    ... ...

    Connection conn = DriverManager.getConnection(strUrl);

    Statement stmt = conn.createStatement();

    ResultSet rs = stmt.executeQuery(strSql);

    WordDocument doc = new WordDocument();

    DataRegion data = null;

    Table table = null;

    int i = 0;

    //循環

    while (rs.next()) {

        //建立資料區域,createDataRegion()方法中的第三個參數一般是文檔中已存在的使用者已預先定義的資料區域,但是還可以使用PageOffice開發平台預留的兩個特殊資料區域:[HOME]和[END]。它們分别代表文檔的開始光标位置和結束光标位置

        data = doc.createDataRegion("reg" + i,

                DataRegionInsertType.Before,"[End]");

        //将模版“template.doc”文檔指派給資料區域

        data.setValue("[word]doc/template.doc[/word]");

        table = data.openTable(1);

        //給表格中單元格指派

        table.openCellRC(2, 1).setValue(rs.getString("ID"));

        table.openCellRC(2, 2).setValue(rs.getString("UserName"));

        ... ...

        i++;

    }

    conn.close();

    PageOfficeCtrl pCtrl = new PageOfficeCtrl(request);pCtrl.setWriter(doc); //不要忘記此行

    pCtrl.setServerPage(request.getContextPath()+"/poserver.zz");  //設定伺服器頁面

    ......

    pCtrl.webOpen("doc/test.doc", OpenModeType.docNormalEdit,"somebody");//線上打開Word文檔

    pCtrl.setTagId("PageOfficeCtrl1");//此行必須

         //C#實作代碼

        //從資料庫中讀取工資資訊

    ......

        OleDbConnection conn =new OleDbConnection(strConn);

    OleDbDataAdapter cmd =newOleDbDataAdapter(strSql, conn);

    DataSet ds =new DataSet();

    conn.Open();

    cmd.Fill(ds,"ds");

    WordDocument doc =newWordDocument();

        if (ds != null && ds.Tables[0] != null && ds.Tables[0].Rows.Count > 0)

    {

        DataTable dt = ds.Tables[0];

        DataRegion[] data =newDataRegion[ds.Tables[0].Rows.Count];

        PageOffice.WordWriter.Table[] table =newPageOffice.WordWriter.Table[ds.Tables[0].Rows.Count];

        //循環

        for (int i = 0; i< dt.Rows.Count; i++)

        {

            //建立資料區域,createDataRegion()方法中的第三個參數一般是文檔中已存在的使用者已預先定義的資料區域,但是還可以使用PageOffice開發平台預留的兩個特殊資料區域:[HOME]和[END]。它們分别代表文檔的開始光标位置和結束光标位置

            data[i]= doc.CreateDataRegion("reg" +i.ToString(),DataRegionInsertType.Before, "[End]");

            //将模版“template.doc”文檔指派給資料區域

            data[i].Value="[word]doc/template.doc[/word]";

            table[i]= data[i].OpenTable(1);

            //給單元格指派

            table[i].OpenCellRC(2,1).Value = dt.Rows[i]["ID"].ToString();

            table[i].OpenCellRC(2,2).Value = dt.Rows[i]["UserName"].ToString();

             ... ...

        }

    }

    conn.Close();

    PageOfficeCtrl1.SetWriter(doc); //不要忘記此行

       PageOfficeCtrl1.ServerPage = Request.ApplicationPath +"/pageoffice/server.aspx";//設定PageOffice元件服務頁面

    ... ...

    PageOfficeCtrl1.WebOpen("doc/test.doc", PageOffice.OpenModeType.docAdmin,"somebody");//線上打開Word文檔

    上述示例的完整代碼可參考相應開發語言的Samples示例包綜合示範示例中的第10個示例:“ 插入 Word 表格模闆動态生成工資條 (企業版)”。    

繼續閱讀