日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Word动态输出多表格方案(以工资条为例)

發(fā)布時間:2024/1/8 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Word动态输出多表格方案(以工资条为例) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)輸出多個工資條表格。

????????

2Word動態(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。