32第12卷烟台职业学院学报摘要:当前,许多企业在信息化建设中大量采用了数据库技术,在报表生成过程中,经常需要将数据库不同表中的数据在一张较复杂的表格中输出。利用VB结合EXCEL模板可以得到一种快速设计复杂报表的方法。关键词:VB;EXCEL;报表打印中图分类号:TP391.13文献标识码:B文章编号:1673-5382200603-0032-04多重嵌套不定长报表的打印方法刘春梅1,杨锦川2(1.烟台职业学院机械工程系,山东烟台264025;2.烟台冰轮股份有限公司,山东烟台264000)报表的打印输出是数据库应用系统开发的一个重要环节,在Visual Basic中可以利用数据环境设计器(Data Environment Designer)与数据报表设计器(Data Repot Designer)来解决这个问题。但在实际应用中,很多报表非常复杂,存在不规则、嵌套、斜线、交叉线、多表数据操作等问题,利用报表设计器进行设计很繁琐。于是很多程序员结合专用的报表软件并通过ActiveX控件如水晶报表等来完成复杂报表的设计,这就要求开发人员必须熟悉第三方软件。我们在这里提供一种相对简单的报表设计打印方法:利用VB 操作EXCEL报表模板,结合ADO(ActiveX Data Object)中RecordSet的循环控制来生成复杂的报表。1问题的提出多重嵌套的不定长报表就是指一份报表不是简单的二维表。其数据源来自数据库中多个表,包含一对多的关系,每份报表的长度是不定的,每页都带表头,涉及多页打印的问题,且一份报表中由于牵扯多批数据,报表本身是多份的,即每页表头的内容是动态改变的。报表实例如表1。该报表是某压力容器产品手册中的一份报告,每个产品可能作多个试板,也就是一份产品手册中可能有多份这种报告,同时每份试板可能作多个焊接接头进行力学试验,也就是说每份报告可能是多页。这就是多重嵌套的不定长报表,其中上半部分数据来自数据库中表report_test_plate1;下半部分数据来自数据库中表report_
test_plate2;两者用字段report_id(产品手册编码)和字段test_plate_NO试板编号进行关联。表1产品焊接试板力学和弯曲性能检验报告收稿日期:2006-04-26作者简介:刘春梅(1964-),女,山东烟台人,烟台职业学院机械工程系副教授.第12卷第3期2006年9月Journal of Yantai Vocational College烟台职业学院学报Vol.12 No.3 Sep.2006第12卷第3期2006年9月Journal of Yantai Vocational College烟台职业学院学报Vol.12 No.3 Sep.200633续表1产品焊接试板力学和弯
曲性能检验报告2解决方案2.1总体思路Microsoft Excel提供的单元格任意合并、拆分和绘图功能基本上能够满足设计所有复杂报表的需求。它对任意一个单元格的格式随意控制,为随心所欲地设计报表提供了强大支持。我们利用Excel来制作报表模板,然后将VB与Excel集成,将从数据库中的检索的数据填入模板生成相应的报表文件并输出。这样就避免了在报表设计器或者第三方报表软件中设计繁琐的报表。至于表格的数据嵌套和不定长,可以在程序中利用两层循环嵌套解决。2.2 Microsoft Excel对象模型微软的Excel对象模型提供了上百个不同的对象,从矩形,文本框等简单的对象到透视表、图表等复杂的对象,可以在VB代码中直接操纵使用,其中最重要的四个对象如下:Application对象:Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。Workbook对象:Workbook对象直接地处于Application对象的下层,表示一个Excel工作簿文件。Worksheet对象:Worksheet 对象包含于Workbook对象,表示一个Excel工作表。Range对象:Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。2.3不定长表格的嵌套
表格的嵌套利用循环的嵌套即可实现至于表格不定长问题我们可以利用RecordSet 的RecordCount与每份报表可容纳的记录数进行整除运算与模运算,即可获知需要处理的报表的整数页数和多余的记录数(即不足一页)。3实现过程3.1 制作报表模版首先利用Microsoft Excel按照报表输出格式制作出相应的报表模版保存为xls 文件或xlt文件均可。3.2 引入Microsoft Excel对象然后在Microsoft VB的开发环境中引用“Microsoft Excel Object Library”。具体方法是通过“工程”菜单中的“引用”完成,如图1所示:图1在VB中引用Excel对象第3期刘春梅,等:多重嵌套不定长报表的打印方法34第12卷烟台职业学院学报3.3 程序主体最后给出具体实现代码程序设计使用MicrosoftVisual Basic 6.0和Microsoft Excel 2000,在Win-dows 2003/XP/98环境下调试成功。另外,本程序利用ADO通过ODBC访问ACCESS2000数据库,需要引用“Microsoft ActiveX Data Objects”系列部件。程序代码如下:’变量定义部分省略’用户接口部分省略’首先根据用户指定的产品编码检索
report_test_plate表,记录集设为r5,细节省略If r5.EOF Then’对report_test_plate表中检索不到数据进行处理,细节省略Elsejs3 1’表示每份产品手册中报表份数Do Until r5.EOF ’第一层循环’取出与report_id关联的试板编号linshi2
r5“test_plate_NO”’对report_test_plate 1进行检索,取出与test_plate_NO关联的试板数据,记录集设为r3,细节省略js1 0’每份报表中整数页数i    1 ’接头序号
r3.MoveFirst counter5 r3.RecordCount Do Until r3.EOF ’第二层循环’根据
test_plate_NO从report_test_plate2中取出与之关联的焊接接头数据,记录集设为r4,细节省略If r4.EOF Then’对report_test_plate2表中检索不到数据进行处理,细节省略Else counter1 7’表一容纳的记录条数counter2 r4.RecordCount ’检索到的记录总数counter3 counter2 counter1 ’整除counter4 counter2 Mod counter1 ’模运算,求余数If counter3 0 Then’当前试板报告是多页或者正好1整页,表格正好填满For js1    1 To counter3’再加一层循环,处理整数页tempfile1 reportid_out “焊接试板力学与弯曲性能检验报告” tempfile2 tempfile1 CStrjs3 CStrjs1’生成报表文件编号Se t xlApp New Excel.Application Set xlApp CreateObject“Excel.Application”’激活EXCEL应用程序xlApp.Visible False ’隐藏EXCEL应用程序窗口strSource
App.Path “Excels焊接试板力学与弯曲性能检验报告.xls”’模版文件的路径与文件
名strDestination1App.Path “reports” strDestination2strDestination1 tempfi le2 strDestination3strDestination2 “.xls” FileCopy strSource strDestination3 ’将模版文件拷贝到一个临时文件Set xlbook xlApp.Workbooks.OpenstrDestination3 ’打开工作簿Set xlSheet xlbook.Worksheets1 ’设定工作表xlSheet.Cells4 2
r3“product_NO”.Value’向模版中填入相关试板数据(上半部分),细节略For js210 To 16 ’开始填入下半部分数据xlSheet.Cellsjs2 1 CStrii i 1’焊接接头序号也可以从数据库取xlSheet.Cellsjs22 r4“tensile_stren
gth”.Value’向模版中填入相关接头数据细节略r4.MoveNextNextxlbook.Save ’保存文件’xlSheet.PrintOut ’执行打印xlApp.Quit ’退出EXCEL’对用户发出相关提示,省略NextEnd IfIf counter4 0 Then’当前试板报告是1页没填满或多页后有不足1页的情况’对用户发出相关提示,省略第12卷第3期2006年9月Journal of Yantai Vocational College烟台职业学院学报Vol.12 No.3 Sep.200635 If js1 0 Then’当前试板报告不足1页js1 js1    1 tempfile2 tempfile1 CStrjs3 CStrjs1 Else’报表在打满几页后余下不足一页tempfile2
tempfile1 CStrjs3 CStrjs1End Ifjs1 js1 1’重复前面的报表处理过程End If End Ifr3.MoveNext js1 0 ’清零i    1 Loopr5.MoveNextjs3 js3    1 ’第一层嵌套文件编号加1LoopEnd If4结论VB与Offic皆出自微软,由于VB的可扩展性,使用和融入Excel的特性是相当方便的。Excel可以用作OLE服务器,向外部输出某些属性、方法和事件。在VB中使用AD和Excel提供的OLE对象,能够轻易地将数据库中的数据输出到Excel工作表里,生成的Excel报表可以利用Excel程序本身的功能来进行预览、打印和保存,也可以直接在VB程序中打印输出。参考文献:〔1〕王卫东,陈希球.VisualBasic程序设计实用教程〔M〕.北京:中国电力出版社,2004.〔2〕章新苏.在VisualBasic编程中运用数据结构〔J〕.计算机与信息技术,2002(9).〔3〕方云波.利用vb动态设计多“主细表”应用〔J〕.中国计算机报,1999-08-01.〔4〕CSDN.用DLL实现把数据库的记录导出到EXCEL中〔EB/OL〕.http://www.csdn.net/.〔2004-8-
9〕.〔5〕CSDN.在VB应用程序中调用Excel2000〔EB/OL〕.http://www.csdn.net/.〔2005-08-07〕.〔6〕CSDN.另类快速导出数据库为EXCEL文档〔EB/OL〕.http://www.csdn.net/.〔04-4-29〕.〔7〕CSDN.几种从数据库读取数据生成excel文件的比较〔EB/OL〕.http://www.csdn.net/.〔2006-07-02〕.〔8〕CSDN.VB/VB.NET/C#导出到Excel的方法〔EB/OL〕.http://www.csdn.net/.〔2006-4-15〕.〔9〕CSDN.用VB控制EXCEL生成报表〔EB/OL〕.http://www.csdn.net/.〔2004-12-27〕.〔10〕吴刚.如何实现VB与EXCEL的无缝连接〔J〕.统计信息化,2003(1).(责任编辑:侯中岩)第3期刘春梅,等:多重嵌套不定长报表的打印方法
>excel表格斜线