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 表格模板动态生成工资条 (企业版)”。