Word动态输出多表格方案(以工资条为例)
1、功能介紹
???????? PageOffice能實現(xiàn)在Word文檔中動態(tài)循環(huán)輸出多個相同格式的表格并在表格的單元格中動態(tài)填充數(shù)據(jù)。
???????? 在Word文檔中使用表格時,有時可能會需要生成多個具有相同格式的表格,例如某大公司需要生成多名員工的工資單、體檢中心要生成多名體檢人員的體檢報告等。若是這些表格的數(shù)量不是太多并且表格中的單元格數(shù)據(jù)相同的話,那么只需多復(fù)制幾份就可。可若是這些表格的數(shù)量很大需要幾百幾千甚至更多且需要從數(shù)據(jù)庫中讀取數(shù)據(jù)記錄寫入表格的單元格中的話可就不那么容易實現(xiàn)了。這些表格中的數(shù)據(jù)若是逐一地靠手動錄入,不僅效率非常低,而且手動輸入的錯誤率亦會很高。而若想既提高工作效率又降低錯誤率那最好的辦法當(dāng)然就是通過程序?qū)崿F(xiàn)了。
???????? 通過PageOffice的數(shù)據(jù)區(qū)域(即DataRegion類)就能高效地實現(xiàn)在Word中動態(tài)循環(huán)輸出多個相同格式和樣式的表格,且能將數(shù)據(jù)庫中的數(shù)據(jù)記錄全部正確的動態(tài)填寫到表格中。????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
什么是數(shù)據(jù)區(qū)域?數(shù)據(jù)區(qū)域是Word文檔中具有 "PO_" 前綴命名的書簽所定位的文檔區(qū)域。簡單來說,數(shù)據(jù)區(qū)域就是一種特殊的Word書簽對象,便于定位Word文檔中的內(nèi)容。數(shù)據(jù)區(qū)域是PageOffice開發(fā)平臺中重要的技術(shù)概念。
這里舉個簡單的例子說明什么是數(shù)據(jù)區(qū)域:假設(shè)開發(fā)者需要在待打開的Word文檔指定位置處顯示產(chǎn)品名稱,就可以先手動打開此Word文檔,在指定位置處插入書簽"PO_ProductName",保存文檔。這樣數(shù)據(jù)區(qū)域"ProductName"就定義好了。編寫代碼 doc.OpenDataRegion("ProductName").Value ="PageOffice"; 即可在此數(shù)據(jù)區(qū)域處生成想要的內(nèi)容。
數(shù)據(jù)區(qū)域的填充及數(shù)據(jù)區(qū)域格式的控制都是通過DataRegion類實現(xiàn)的,很多Word操作都需要調(diào)用DataRegion類完成。DataRegion類能通過調(diào)用 OpenDataRegion(String) 方法或CreateDataRegion(String, DataRegionInsertType, String) 方法獲得 DataRegion 對象。
???????? PageOffice要實現(xiàn)在Word文檔中動態(tài)輸出多個相同格式的表格很容易。下面以輸出多個工資條為例來描述具體的實現(xiàn)方法。首先在一個Word文檔中設(shè)置好所要輸出的工資條數(shù)據(jù)表格的樣式和格式,將其作為模版文檔,命名為“template.doc”;然后創(chuàng)建一個空白的Word文件,用來輸出多個工資條表格,命名為“test.doc”;再通過程序讀取數(shù)據(jù)庫中的相應(yīng)數(shù)據(jù),按讀取的記錄數(shù)據(jù)進(jìn)行循環(huán),在循環(huán)時創(chuàng)建數(shù)據(jù)區(qū)域,將模版“template.doc”賦值給每次創(chuàng)建的數(shù)據(jù)區(qū)域,并向表格中填充數(shù)據(jù),最后在線打開“test.doc”文檔,即可在其上動態(tài)輸出多個工資條表格。
????????
2、Word動態(tài)輸出多表格(以工資條為例)具體實現(xiàn)方法
???????? PageOffice開發(fā)平臺下,Word動態(tài)輸出多個工資條表格的具體實現(xiàn)過程很簡單,只需要將PageOfficeCtrl控件類、WordDocument類、DataRegion類結(jié)合Table類使用即可實現(xiàn)這一功能。
???????? 在Word中動態(tài)生成多個工資條的具體實現(xiàn)步驟如下:
???????? ①先在一個Word文檔中設(shè)置好要輸出的工資條表格的樣式和格式做成Word模版,將其命名為“template.doc”。
???????? ②創(chuàng)建一個空白的Word文檔,用來在其中輸出多個工資條表格,將其命名為“test.doc”。
???????? ③根據(jù)查詢條件,通過程序獲取員工工資信息,再循環(huán)讀取員工的工資信息,并在每次循環(huán)時都調(diào)用DataRegion類的CreateDataRegion(string NewDataRegionName, DataRegionInsertTypeInsertType, string RelativeDataRegionName)方法創(chuàng)建一個數(shù)據(jù)區(qū)域,將模版“template.doc”文檔作為值賦值給該數(shù)據(jù)區(qū)域,然后再將員工的工資信息動態(tài)填入表格的單元格中。
???????? 數(shù)據(jù)區(qū)域值的類型可以是文本類型、Word文件類型、Excel文件類型、圖片類型等。一般將Word、Excel、圖片類型的值賦值給數(shù)據(jù)區(qū)域時,寫法為:“[word]word文件路徑[/word]”、“[excel]excel文件路徑[/excel]”、“[image]image圖片路徑[/image]”。此示例中為實現(xiàn)動態(tài)生成多個表格是將Word文件類型的值賦值給數(shù)據(jù)區(qū)域。
???????? PageOffice標(biāo)準(zhǔn)版只支持文本類型,專業(yè)版只支持文本、圖片和Word文件類型,企業(yè)版文本、Word文件、Excel文件、Image圖片類型都支持。使用時請一定要注意。
???? 數(shù)據(jù)區(qū)域的具體使用方法和調(diào)用請參見相應(yīng)開發(fā)語言的開發(fā)幫助和開發(fā)示例包中的示例。
???????? ④調(diào)用PageOfficeCtrl類對象的WebOpen(Stringfilename,OpenModeType type, String userName)方法打開Word文件“test.doc”,在“test.doc”文檔中動態(tài)輸出和顯示多個工資條表格。
????????
???????? PageOffice開發(fā)平臺下,Word動態(tài)輸出多個工資條表格的具體實現(xiàn)代碼如下:
???????? //Java實現(xiàn)代碼
???????? //從數(shù)據(jù)庫中讀取工資條信息
??? ... ...
??? 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;
??? //循環(huán)
??? while (rs.next()) {
??????? //創(chuàng)建數(shù)據(jù)區(qū)域,createDataRegion()方法中的第三個參數(shù)一般是文檔中已存在的用戶已預(yù)先定義的數(shù)據(jù)區(qū)域,但是還可以使用PageOffice開發(fā)平臺預(yù)留的兩個特殊數(shù)據(jù)區(qū)域:[HOME]和[END]。它們分別代表文檔的開始光標(biāo)位置和結(jié)束光標(biāo)位置
??????? data = doc.createDataRegion("reg" + i,
??????????????? DataRegionInsertType.Before,"[End]");
??????? //將模版“template.doc”文檔賦值給數(shù)據(jù)區(qū)域
??????? 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");??//設(shè)置服務(wù)器頁面
??? ......
??? pCtrl.webOpen("doc/test.doc", OpenModeType.docNormalEdit,"somebody");//在線打開Word文檔
??? pCtrl.setTagId("PageOfficeCtrl1");//此行必須
?
???????? //C#實現(xiàn)代碼
????????//從數(shù)據(jù)庫中讀取工資信息
??? ......
????????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];
??????? //循環(huán)
??????? for (int i = 0; i< dt.Rows.Count; i++)
??????? {
??????????? //創(chuàng)建數(shù)據(jù)區(qū)域,createDataRegion()方法中的第三個參數(shù)一般是文檔中已存在的用戶已預(yù)先定義的數(shù)據(jù)區(qū)域,但是還可以使用PageOffice開發(fā)平臺預(yù)留的兩個特殊數(shù)據(jù)區(qū)域:[HOME]和[END]。它們分別代表文檔的開始光標(biāo)位置和結(jié)束光標(biāo)位置
??????????? data[i]= doc.CreateDataRegion("reg" +i.ToString(),DataRegionInsertType.Before, "[End]");
??????????? //將模版“template.doc”文檔賦值給數(shù)據(jù)區(qū)域
??????????? 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";//設(shè)置PageOffice組件服務(wù)頁面
??? ... ...
??? PageOfficeCtrl1.WebOpen("doc/test.doc", PageOffice.OpenModeType.docAdmin,"somebody");//在線打開Word文檔
?
??? 上述示例的完整代碼可參考相應(yīng)開發(fā)語言的Samples示例包綜合演示示例中的第10個示例:“ 插入 Word 表格模板動態(tài)生成工資條 (企業(yè)版)”。總結(jié)
以上是生活随笔為你收集整理的Word动态输出多表格方案(以工资条为例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: click是哪个键 wheel_Clic
- 下一篇: ssm毕设项目基于的少儿编程学习系统2l