WordReport

WordReport用于编程生成Word报表。

定义一个WordReport的语法为:

Dim wrt As New WordReport(Table, TemplateFile, ReportFile)

Table: 要打印的表(Table)或表的名称
TemplateFile:字符型,模板文件名称,含路径
ReportFile:字符型,生成的报表文件名称,含路径

WordReport的成员有:

名称 说明
Build 方法,生成报表。
BuildOne 方法,根据指定的一行数据生成报表,语法:

BuildOne(dr)

dr: DataRow或Row类型,根据此行数据生成报表。
Replace 方法,将指定的内容替换为新的内容,语法:

Repalce(findstr,replacestr)

findstr: 字符型,指定要查找的内容
replacestr: 字符型,指定用于替换的内容。

Replace是全局有效。

ReplaceOne 方法,将指定的内容替换为新的内容,语法:

RepalceOne(findstr,replacestr)

findstr: 字符型,指定要查找的内容
replacestr: 字符型,指定用于替换的内容。

ReplaceOne只对下一条记录生效,需要和BuildOne配合使用。

ReplaceWithImage 方法,将指定的内容替换为图片,语法:

ReplaceWithImage(findstr,imagefile,width,height)

findstr: 字符型,指定要查找的内容
imgefile:字符型,用于替换的图片文件
width: 整数型,指定图片宽度
height:整数型,指定图片高度
Quit 方法,退出报表
Show 方法,启动Word,显示生成的报表。
SaveToPdf 保存工作簿为PDF文件,语法为:

SaveToPdf(File)

File: 文件名称,含路径。

RecordsOnEachPage 属性,整数型,指定每页打印的记录数。

重要提示:

用WordReport生成报表之后,必须执行Quit方法退出,或者执行Show方法显示报表,否则内存将常驻一个Word进程, 影响后续报表的生成和设计,直到你中断这个进程,切记切记。


示例一

常规的根据模板生成报表:

Dim tm As String  = ProjectPath & "Attachments\出库单.doc" '指定模板文件
Dim
fl As String = ProjectPath & "Reports\出库单.doc" '指定目标文件
Dim
wrt As New WordReport(Tables("出库"),tm,fl) '定义一个WordReport
wrt.Build()
'逐行生成报表
wrt.Show()
'显示报表

提示,Build方法根据当前选定行生成报表。

示例二

利用BuildOne方法,可有根据指定条件的行来生成报表,例如:

Dim drs As List(of DataRow) = DataTables("出库").Select("出库日期 = #" & Date.Today & "#") '筛选出符合条件的行
If
drs.Count > 0 Then '如果存在符合条件的行
    Dim
tm As String  = ProjectPath & "Attachments\出库单.doc" '指定模板文件
    Dim
fl As String = ProjectPath & "Reports\出库单.doc" '指定目标文件
    Dim
wrt As New WordReport(Tables("出库"),tm,fl) '定义一个WordReport
    For Each
dr As DataRow In drs '逐行生成报表
       
wrt.BuildOne(dr)
    Next
   
wrt.Show() '显示报表
End If

再例如根据已经勾选的行生成报表:

Dim rs As List(of Row) = Tables("出库").GetCheckedRows
If
rs.Count > 0 Then '如果存在符合条件的行
    Dim
tm As String  = ProjectPath & "Attachments\出库单.doc" '指定模板文件
    Dim
fl As String = ProjectPath & "Reports\出库单.doc" '指定目标文件
    Dim
wrt As New WordReport(Tables("出库"),tm,fl) '定义一个WordReport
    For Each
r As Row In rs '逐行生成报表
       
wrt.BuildOne(r)
    Next
   
wrt.Show() '显示报表
End If

实例三

你可以在生成模板前,先用Repalce修改模板,这样我们可以用代码完成一些Word报表无法直接实现的统计,然后将得到的统计结果替换约定的标记,例如:

Dim tm As String  = ProjectPath & "Attachments\订单.doc" '指定模板文件
Dim
fl As String = ProjectPath & "Reports\订单.doc" '指定目标文件
Dim
wrt As New WordReport(Tables("订单"),tm,fl) '定义一个WordReport
wrt.Replace(
"[合计]",DataTables("订单").Compute("Sum(数量)")) '用代码计算出总的销售数量并替换模板中的合计标记
wrt
.Build() '生成报表
wrt
.Show() '显示报表

示例四

Replace对模板的修改是全局的。
我们也可以用ReplaceOne修改模板,和Repalce不同,RepalceOne仅对下一条记录生效,需要和BuildOne配合使用,例如:

Dim tm As String  = ProjectPath & "Attachments\订单.doc" '指定模板文件
Dim
fl As String = ProjectPath & "Reports\订单.doc" '指定目标文件
Dim
wrt As New WordReport(Tables("订单"),tm,fl) '定义一个WordReport
Dim
sum As Integer
For Each
r As Row In Tables("订单").rows '逐行生成报表
   
sum = sum + r("数量") '逐行累计
   
wrt.ReplaceOne("[合计]",sum)
   
wrt.BuildOne(r)
Next

wrt
.Show() '显示报表

这样生成报表的时候,每一条记录的合计,都是截止到此行为止的合计。

实例五

假定我们要给员工资料卡加上二维码,可以在设计模板的时候,引用一个约定的图片文件:
 

然后用下面的代码生成报表,在生成每个员工的资料卡之前,都先根据这个员工的资料合成一个二维码,并保存为约定的图片文件:

Dim tm As String  = ProjectPath & "Attachments\员工资料卡.doc" '指定模板文件
Dim
fl As String = ProjectPath & "Reports\员工资料卡.doc" '指定目标文件
Dim
mg As String = ProjectPath & "Images\二维码.wmf" '约定的图片文件
Dim
wrt As New WordReport(Tables("员工"),tm,fl) '定义一个WordReport
For Each
r As Row In Tables("员工").Rows '逐行生成报表
    Dim
Bar As New BarCodeBuilder
   
Bar.Symbology = Barpro.Symbology.QRCode
    Bar.QRCodeModuleSize =
2 '二维码的放大倍数
   
Bar.Code = "姓名:" & r("姓名") & vbcrlf & "部门:" & r("部门") & vbcrlf & "电话:" & r("办公电话")
   
bar.SaveImage(mg,300)
   
wrt.BuildOne(r)
Next

wrt
.Show() '显示报表

这是生成的报表,有兴趣的话,你可以扫描一下这个二维码:


总结:Word报表有BuildOne和RepalceOne方法,可以逐行生成报表,可以逐行修改模板,而且用BuildOne生成报表的时候,行可以来自不同的表,只要模板中引用的列存在即可,非常灵活。


本页地址:http://www.foxtable.com/webhelp/topics/2890.htm