用VB_NET自定义控件实现Web报表打印
用 VB.NET自定义控件实现 Web 报表打印
徐才权
(人民银行淮安市中心支行,淮安22300 1)
摘 要 讲解了用 VB.NET开 发 Windows控件,并把该控件嵌入 到 Web页面的方 法通过在控件中解析 Web页 面 。
提交的 XML 文件数据,实现 Web报表打印 。
关键词 Windows控件; XML;Web 打印
Use VB.NET Self-defined Contro l Library to Realize Web ReportPrint
XU Caiquan
(The Peoples Bank HuaianCentra l Branch,Huaian 22300)1 ’
Abstract:Introducet he method how to use VB.NET s ignto Wdeindows control library, and toput the control library
in a webpage.By to parse theXML file submittedby webpagein the control library , to realize web reporpt rint.
Key words:Windowsco ntrol library;XML;WebPirnt
PrintPreviewDialog 类:通过 ShowDialog 方法实现打印文档 1 前言 的打印预览。 在开发 B/S 结构的应用程序中,报表打印一直是一个比较 2.2 打印控件 麻烦的问题,特别是一些灵活的 Web报 表打印、一些发票的 用 VB.NET创建一个 Windows控件库,在该控件中放上两 精确套打,更不容易实现。目前的 Web打印控制技术主要有 个按钮,分别用于打印及打印预览,同时为了解析Web 页面
传进的 XML 文件,我们定义一个公共属性,用于连接该 XML 以下三种
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
: (1) 自定义控件完成打印; (2) 利用 IE 自
文件。在 PrintPage 事件中,通过解析 XML 文件,读取其中的 带的 WebBrowser控件实现打印 ; (3) 利用第三方控件实现 数据,实现具体打印功能控件经过编译后,生成一个 DLL 。打印。利用 IE 打印,其打印功能太简单,不能满足实际应用 文件,用于 Web页面 。中复杂报表打印的需要,利用第三方控件需要付一定的费用, 2.3 控件插入网页 在需要插入控件的网页安装部署也比较复杂。自定义控件方式 (本文以 VB.NET作 为 中,加入以下标记:
开发工具、 开发环境为 Visual Studio. NET 200)3 就是利用
,然后将该控件文
件拷贝到和该网页相同的目录中 (标记中 webprint.dll 为生成 通过在控件中定义的属性接收 Web页面提交 的 XML 文件,然 的控件文件名,printcontrol 为控件的类名)。 后解析该 XML 文件,实现 Web报表打印 。 2.4 安全设置 2 方法由于控件的运行必须借助.NET framework类 库 ,因此客
户机或服务器上必须安装.NET framework1.版本1 。虽然 IE 在 2.1 打印类
Windows打印类有很多, 本文用到其中的三个:PrintDoc, 加载控件时没有任何安全警告,但在打印报表
时, .NET framework 会动态地检查代码的安全性,由于没有umentPageSettingsPrintPreviewDialog 、、。
安全授权而 无法打印报表。具体解决办法如下:在控制面PrintDocument 类:用于将输出发送到打印机。通过实例
版-->管理工 具-->Microsoft .NET Framewo1rk.1 配置-->我化一个 PrintDocument,设置相关属性描述打印的内容,再调
的电脑>运行 库 安 全 策 略 > 计 算 机 > 代 码 组 --------用 Print 方法,实现打印功能。在调用 PrintDocument.Print 方
>All_Code, 在 Inter,ne t_ZoneTrusted_Zone 的编辑代码组、“法时,引发下列事件:BeginPrint、PrintPage、EndPirnt,其中
属性”中,修改“权 限集”为“FullTrust”,见图 1 所示。 最重要的是 PrintPage 事件处理过程,是打印的关键。Print,
2.5 XML文件 Page事 件的参数类型 (PrintPageEventArgs) 具有 (1) Has, 本文用于打印的 XML文件,结构比较简单,格式如下:
Graphics: MorePages属性:用于控制打印页是否结束 ; (2)
打印具体内容。
PageSettings 类:用于设置打印页的纸张类型方向边 、、
距等 。
本文收稿日期:2008 年 5 月 15 日
Imports System.IO Imports System.Xml 操作 (A) 查看 (V) Imports System.Xml.XmlDocument 树权限集:FullTrust .NET Configuration 1.1 Imports System.Xml.XmlNode 我的电脑 程序集缓权限集
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
: 存 已配置的程序集 远程处理服务 Imports System.Xml.XmlElement 允许对所有资源进行 运行库安全策略 Imports System.Xml.XmlNodeList 企业 完全访问 计算机Imports System.Drawing 代码组All_Code 任务Imports System.Drawing.Printing My_Computer_zone LocalIntranet_zo Imports System.Windows.Forms.UserControl Internet_Zone 编辑代码组属性Restrcted_Zone i代码组属性对话框使您可以 “”Public Classprintcontrol Trusted_Zone 编辑此代码组的名称、 说明、 成员条件和权限集 Inherits System.Windows.Forms.UserControl
Public sAs String
图 1 Private printFontAs Font ' 报表字体
Private topicFontAs Font ' 报表标题字体
Private streamToPrintAs StreamReader Private xmldocAs XmlDocument= New XmlDocument 001 Private nodelistAs XmlNode 李三平Private nodeAs XmlNode 23 Privateroot As XmlElement 男Private pagenumAs Integer 报表页码 ' 唱歌 Private totalpageAs Integer 报表总页数' Private mypenAs Pen= New Pen(Color.Blue,1) ……
Public Propertyxmlfile() As String ' 定义一个属性,接收web 页面传递的 XML 文件
Get 3 实现 Return s3.1 启动 Visual Studio .NET200 3,建一个" Windows控 End Get
件库" 的新项目,在项目名称处写入webprin ,如t图2 所示。 Set(ByVa Value As String) l在窗体中添加两个按纽,Name 分别为:print 和 preview,按纽 s = Value 的 Text 属性分别为“打印报表”和“打印预览”,再添加一个 Label1.Text= s Label 控件用来显示程序状态。 End Set End Property
……
模板
个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载
(T) 项目类型 (P) Visual Basic 项目 End Class 安装和部署项目 其他项目 Wndows 应 i 类库Windows 控 3.3 添加 PrintDocument的 PringPage事件,核心代码如下: 用程序 Visual Studio解决方案 件库 Private Sub PrintDocument1_PrintPage (ByVal sender As
System.Object, ByVal ev As System.Drawing.Printing.Prin, t ASP.NET ASP.NET 智能设备Web 服务 应用程序 Web 应用程序PageEventArgs) 用于创建在 Windows 应用程序中使用的控件的项目Dim linesPerPageAs Single= 0 名称 (N): webprint Dim yPosAs Single= 0 C:\ 浏览位置 (L): 添入解决方案 (A) 关闭解决方案 (C) Dim count As Integer= 0 将在 C:\webprint 处创建项目 Dim k As Integer 更多 (E) 确定取消帮助Dim xmldata(5)As String
Dim s As String 图 2
Dim leftMargin As Single= ev.MarginBounds.Left 3.2 添加命名空间、定义相关变量和属性,并把系统默认 Dim topMarginAs Single= ev.MarginBounds.Top 的 Public Class UserControl1 改为 Public Classprintcontro ,l核 Dim botmarginAs Single = ev.MarginBounds.Bottom 心代码如下: If nodelistIs Nothing Then 没有数据,退出 '
Exit Sub ' 获取 XML 文件下一个节点
End While End If ev.Graphics.DrawString(公司职工基本情"况表
", top, ev.Graphics.DrawLine(mypen, leftMargin, yPos+ 18,
icFont, Brushes.Black,leftMargin + 210, topMargin - 60, New leftMargin + 600, yPos+ 18) 表底横线 '
StringFormat) ev.Graphics.DrawLine (mypen, leftMargin, topMargin
ev.Graphics.DrawLine (mypen, leftMargin, topMargin 22, leftMargin, yPos+ 18) 第一条竖线- '
ev.Graphics.DrawLine(mypen, leftMargin+ 100, top, - 22, leftMargin + 600, topMargin- 22)
' 第一行横线,表头22, leftMargin + 100, yPos + 18) ev.Graphics. Margin -
ev.Graphics.DrawString (" 编号", printFont, Brushes. DrawLine (mypen, leftMargin+ 200, topMargin- 22, leftMargin
+ 200, yPos+ 18) Black, leftMargin+ 10, topMargin 20, New StringFormat) -
ev.Graphics.DrawLine(mypen, leftMargin+ 300, top, ev.Graphics.DrawString (" 姓名", printFont, Brushes. Margin- 22, leftMargin + 300, yPos+ 18) Black, leftMargin+ 110, topMargin 20, New StringFormat) -
ev.Graphics.DrawLine(mypen, leftMargin+ 400, top, ev.Graphics.DrawString (" 年龄", printFont, Brushes. Margin- 22, leftMargin + 400, yPos+ 18) Black, leftMargin+ 210, topMargin- 20, New StringFormat)
ev.Graphics.DrawLine(mypen, leftMargin+ 600, top, ev.Graphics.DrawString (" 性别", printFont, Brushes.
Margin- 22, leftMargin + 600, yPos+ 18) ' 最后一条竖线Black, leftMargin+ 310, topMargin- 20, New StringFormat)
ev.Graphics.DrawString第(":" + CStr(pagenum)+ " / ev.Graphics.DrawString (" 爱好", printFont, Brushes. " + CStr(totalpage)+ " 页", printFont, Brushes.Black,leftMargin Black, leftMargin+ 410, topMargin- 20, New StringFormat)
+ 240, yPos+ 40, New StringFormat)' 打印页码 'linesPerPage = ev.MarginBounds.Height / printFont.Get H,
If Not (nodelistIs Nothing)Then eight(ev.Graphics)每页打印表格行数,,这里设 linesPerPage=33
ev.HasMorePages= True ' 有下一页,是 linesPerPage=33
pagenum= pagenum+ 1 While count < linesPerPage
Else If nodelistIs NothingThen
ev.HasMorePages= False 有下一页,否' Exit While
End If End If
End Sub node= nodelist.FirstChild
3.4 在窗体中添加“打印报表”和“打印预览”按纽,其 ' 读取 xml 文件一个节点
name分别为: print 和 preview。k = 0
3.4.1“打印报表”按纽的 Click 事件,核心代码如下:While Not (nodeIs Nothing)
Private Sub print_Click (ByVal sender As System.Object, xmldata(k)= node.InnerText
ByVal e As System.EventArgs) Handlesprint.Click 把节点中各元素的值赋给数组'
Try node= node.NextSibling()
xmldoc.Load(s)' 加载 XML 文件k = k + 1
root = xmldoc.DocumentElement End While
totalpage= Int((root.ChildNodes.Count)/ 33) + 1 yPos = topMargin + count * printFont.GetHeight
报表总页数' (ev.Graphics)
pagenum= 1 ev.Graphics.DrawLine (mypen, leftMargin, -yPos
nodelist= root.ChildNodes(0) 2, leftMargin + 600, yPos- 2) ' 表格横线
printFont= New Font("宋体", 12) ' 报表字体 ev.Graphics.DrawString (xmldata (0), printFont,
topicFont= New Font("黑体", 14) 报表标题字体 ' Brushes.Black, leftMargin + 10, yPos,New StringFormat)
Dim printdocument1As New PrintDocument ev.Graphics.DrawString (xmldata (1), printFont,
' 实例化一个 PrintDocumentBrushes.Black, leftMargin + 110, yPos,New StringFormat)
printdocument1.DocumentName= "A4 横向打印" ev.Graphics.DrawString (xmldata (2), printFont,
Dim pgsetAs New PageSettings Brushes.Black, leftMargin + 210, yPos,New StringFormat)
If Not (pgsetIs Nothing)Then ev.Graphics.DrawString (xmldata (3), printFont,
printdocument1.DefaultPageSettings= pgset Brushes.Black, leftMargin + 310, yPos,New StringFormat)
End If ev.Graphics.DrawString (xmldata (4), printFont,
Dim ps As PaperSize 设置固定的纸张:A4横向' 、Brushes.Black, leftMargin + 410, yPos,New StringFormat)
Dim i As Integer count = count + 1
For i = 0 To printdocument1.PrinterSettings.Pa, nodelist= nodelist.NextSibling
perSizes.Count- 1 3.5 新建一个网页 print.htm,把生成的控件文件 webprint.
dll 拷贝到和网页相同的目录中,print.htm 内容如下: ps = printdocument1.PrinterSettings.PaperSizes.Item(i) If ps.PaperName.ToString= "A4" Then
printdocument1.DefaultPageSettings.PaperSize = ps
printdocument1.DefaultPageSettings.Landscape = True
Next
打印测试
AddHandler printdocument1.PrintPage, AddressOf
PrintDocument1_PrintPage functioncc()
printdocument1.Print() ' 打印报表 {
Catchex As Exception var ss=";;
Label1.Text= "出现错误:" + ex.Messagemyprint.xmlfile=ss
End Try }
End Sub
3.4.2 打印预览按纽的 Click 事件,核心代码如下:“”
Private Sub preview_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handlespreview.Click Web报表打印测试
Try
xmldoc.Load(s) 加载 XML 文件'
pagenum= 1
Dim printpreviewdialog1As New PrintPreviewDialog
printdocument1.DocumentName = "A4 横向打印"
printpreviewdialog1.Document= printdocument1 3.6 运行结果如图 3 所示。 Dim pgsetAs New PageSettings If Not (pgsetIs Nothing)Then 文件 (F) 编辑 (E) 查看 (V) 收藏 (A) 工具 (T) 帮助 (H) printdocument1.DefaultPageSettings= pgset 搜索收藏夹后退媒体End If 转到 链接设置固定的纸张 :A4横向' 、
Web报表找印测试 Dim i As Integer
For i = 0 To printdocument1.PrinterSettings.Pape, r打印报表打印预览ps = printdocument1.PrinterSettings.PaperSizes.Item(i) If ps.PaperName.ToString= "A4" Then 加载 XML 文件
printdocument1.DefaultPageSettings.PaperSize = ps printdocument1.DefaultPageSettings.Landscape = True 关闭页End If
Next 公司职工基本情况表AddHandler printdocument1.PrintPage, AddressOf 编号姓 名年 龄性 别爱 好王小平 男 球类 棋034 44 PrintDocument1_PrintPage 张安林 男 类 网上035 55 printpreviewdialog1.ShowDialog() ' 打印预览 许 峰 男 聊天 旅036 23 孙英红 女 游活动 Catchex As Exception 037 24
Label1.Text= "出现错误:" + ex.Message 第:2/2 页
End Try
End Sub 图 3 运行结果 (下转到 10 页)
Selection.MoveDown Unit:=wdLine,Count:=1 界面形式如图 3 所示。
End Sub
SubAV() ' 求平均宏
' AV Macro
制作出的三个宏按钮 学生成绩表Selection.InsertFormula Formula: = " =AVERAGE 学号姓名英语高等数学计算机应用教育技术总分张 光 (ABOVE)", NumberFormat:="0.0" 20051601 70 75 86 85 316 李阳一 20052816 78 80 66 90 314 王海海 20051238 75 60 88 70 293 Selection.MoveRight Unit:=wdCharacter,Count:=1 刘立二 20057896 50 80 66 60 256 赵 里 20051122 75 78 82 80 315 End Sub 孙 中 80 82 75 65 302 20057788 SubGR() 求统计图 ' 各科平均分73.0 71.7 73.5 20.0 299.3
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.Tables(1).Select
Selection.InlineShapes.AddOLEObjectClassType : = "MS, 图 3 Graph.Chart.8", FileName_: = "", LinkToFile :=False,DisplayAs ,I
2.5 表格数据的填充 con:=False 在对表格数据进行填充时,使用 Word 2003 按上述办法 Selection.ParagraphFormat.TabStops.Add Position:=Cen, 会很顺利。若使用 Word 2000,则要进行一个处理,即在求平 timetersToPoints (0.32), Alignment:=wdLignTableft, Leader:= 均值时,
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
中的函数 AVERAGE (AVOVE对表头数据 ) (标
wdTableaderspces 题) 识别为 0,计算时将它视为统计数据的一员了,所以最后
End Sub 的结果是不准确的,解决这一问题的办法是:先将表头与数
据部分拆分,将鼠标指向表头的下一行,选择表格|拆分表 “ 3 结论格”,然后将光标停在需填充数据的单元格上,点击工具栏中 通过使用宏的操作技术,在不脱离 Word 操作环境下,得 相应的宏按钮或按下该宏对应的快捷键,即可完成表中相应 出一种新的数据统计方法,简化重复操作,将每种系列性操 的数据处理。处理完表中数据后,再删除表头与表体之间进 作浓缩化简为工具栏中的宏按钮或按快捷键即可完成宏 、。行拆分时的回车符。 的强大功能,为我们提供了简化手段,提高了处理的效率。 2.6 三个宏的代码
在 VB 编辑器中,对应上述三个宏的代码为: 作者简介
SubSU() ' 求和宏 姓名:周玉萍;女;副教授;学位:硕士 主要研
究方向:计算机应用技术 作者单位:海南师范大su Macro
学计算机科学与教育技术系
E-mail: hnzhouyp@126.com
Selection.InsertFormula Formula: = " =SUM (LEFT)",
NumberFormat:=""
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[2] (上接 7 页)
printing.aspx 4 结语 [3] 本文通过实例详细介绍了用自定义控件实现Web 报表 打
作者简介印的方法,利用该方法可以打印出复杂的报表,包括表头中 徐才权 单位:中国人民银行淮安市中心支带有斜线的报表等,同时,用于报表的 Xml 文件的格式
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
行科技科 E-Mail:old_xu@tom.com 也不复杂,这对于从数据库进行 Xml 格式的数据查询、转换
或通过程序生成该 Xml 文件就比较简单了。利用本方法,经
过少量的代码修改,可以快速做出类似的报表,具有一定的
实用性。
参考文献
[1] 胡百敬,罗彗真著.精通 Visual Basic.NET程序设计 [M] .北
京:中国青年出版社,2001.