用C Builder制作复杂的电厂生产报表王莉琳1

时间:2023-08-07 13:14:12 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
C++Builder制作复杂的电厂生产报表

王莉琳, 程忠

1.华中电网有限公司技术中心,湖北 武汉 430077

2. 湖北青山热电厂, 湖北 武汉 430082

摘要:为了解生产的运行状况,电厂经常要制作一些格式复杂、数据量大的生产和管理报表,C++Builder在开发数据库方面具有强大的功能,而由于微软办公软件的普及,许多人已习惯使用电子表格处理软件Excel来完成数据统计的工作,本文从单独用C++Builder制作报表和将二者结合起来两个方面全面地介绍了如何用C++Builder制作复杂的电厂生产报表。

1

2



为便于掌握和分析生产的运行状况,厂经常要制作大量各式各样的生产和管理报表,这些报表按其输出格式可分为简单报表和复杂报表两种。简单报表是指报表中的数据以规律的排列格式显示,完成这种报表设计对C++Builder来说并不是件什么难事,对于那些只需反映数据库中的原始数据而不需要什么格式的简单报表,直接利用C++Builder提供的自动创建数据报表的工具“Quick Report Wizard”就可轻松搞定。复杂报表是指报表中的数据排列格式无规律可寻,完成这种报表设计的途径有两种,一种是借助C++Buildervcl里面提供的一组处理报表打印的组件QuickReport,通过这组组件可以让报表设计者以可视化的方式来完成数据的定位和显示以及设计报表的格式;另外一种是采用OLE技术将数据传到Excel中已设计好报表格式的模板中来完成所需要的报表。这两种设计复杂报表的方法对简单报表也同样适用。

1 利用QuickReport组件完成复杂报表

QReport页面中拖拉QuickRep组件Form上,然后在QuickRepBands属性中选择建立报表的标题、表头、表身、表尾等,此时的可视组件Form就会变成报表模式。报表的格式主要在表身(DetailBand上完成,一般常用QRShape组件来完成表格线的绘制,QRLabel组件来显示文字和数据,QRMemo组件来显示需要换行的文字,还可通过QRDBText组件与Table组件相连直接读取数据库中的数据。将各种类型的报表组件放在QuickRep组件不同状态的带状 Band区域上完成报表的设计,这是报表的静态设计,静态设计报表的方便之处是可以在制表的过程中随时从QuickRep组件的弹出菜单中选择Preview观看报表格式的打印效果,但看不到数据。如果是编写代码来动态地设计表格,程序运行后才能看到报表的打印效果。

1.1 在窗体中静态设计表格

静态设计表格就是直接将绘制表格线和显示文字、数据的各类组件拖拉到Quick Rep组件上。

设置QRShape组件的Shape属性为qrs VertLineWidth属性为1,这就是报表的垂直线;设置QRShape组件的Shape属性为qrsHorLineHeight属性为1,这就是报表的水平线。然后分别设置水平线和垂直线的 LeftTop属性完成行列线的定位,设置水平线的Width属性和垂直线的Height属性确定行列线的长度。对于行列线极不规则的复杂报表,采用QRShape组件可以很灵活地一段一段地设置行列线,而且不必运行程序就能看到报表格式的打印效果,便于及时进行修改。

设置QRLabel组件或QRMemo组件的属性完成显示数据或文字的定位、字体大小等,程序运行后执行对组件进行赋值的操作,方可看到实际数据。为避免看到报表的静态设计窗口,要将该窗口设为动态调用,程序执行Preview命令打开报表随之就释放该窗口的内存空间,该窗口被关闭,但不会关闭报表。

1.2 采用代码动态设计表格

有些复杂报表的特点是只有少部分内


容的排列格式不规则,并且需要显示的数据量很大,虽然QRDBText可以显示大量的数据,但它只能针对格式规则的报表,而一个个地设置QRLabel组件或QRMemo组件,工作量很大。由于C++Builder的各种组件都是通过类来实现的,因此可以在程序中声明 TQRShapeTQRLabelTQRMemo等类变量,通过循环语句来完成格式规则的部分,格式不规则的部分就逐一进行设定。虽然采用编写代码的方法设计报表直观性差,但工作效率高,修改方便。

2 利用OLE技术调用Excel完成复杂报表

由于微软办公软件的普及,许多人已习惯使用电子表格处理软件Excel来完成数据统计的工作,因此如果能把经C++Builder程序处理过的数据或计算的结果传到Excel中,一方面可以扩大程序的适用面,另一方面也极大地减轻了报表格式设计的工作量,毕竟Excel的表格处理功能要比QuickRep ort组件强大得多。C++Builder程序中调Excel就要用到OLEObject Linking and Embedding即对象的链接和嵌入)技术,即在组件的事件过程中或调用Excel的函数中建立OLE对象,然后通过设定该对象的属性和调用该对象的方法来操纵Excel

2.1 建立模板

模板就是一个预设的只有格式没有数据的Excel文件,定义一个AnsiString型变量ExcelFileName,然后将模板的路径名赋给该变量,这样通过该变量就可调用该模板了。

2.2 添加文件

有两个文件是调用Excel模板的程序所必须包括的,建立调用Excel模板的窗口FormForm.h#include "Excel_2K_ SRVR.h",在Form. cpp#pragma link "Excel_2K_SRVR"

2.3定义调用Excel模板的变量

定义Variant类型变量ExWbSheet设置Ex=CreateOleObject("Excel.Applica

tion")启动Excel,用Ex.OlePropertyGet "WorkBooks".OleProcedure("Open", ExcelFileName.c_str())打开Excel模板,设置Wb=Ex.OlePropertyGet("ActiveWork Book")获取当前默认的工作簿,设置Sheet= Wb.OlePropertyGet("ActiveSheet")获取 当前默认的工作表。

2.4 数据的显示

利用函数Sheet.OlePropertyGet("Cel ls",iRows[n],iCols[n]).OlePropertySet ("Value",strData[n])就可将所需数据显示到Excel模板中相应的位置。iRows[n]iCols[n]这两个整数型数组分别用来存储每个数据在Excel模板中所处位置的行列号,strData[n]既可以是字符型数组,也可以是非字符型数组。

2.5 C++Builder程序中操纵Excel模板

因为要设定调用Excel模板的变量和显示数据的行列号,以及要对是否成功打开Excel模板进行判断,所以一般先单独定义调用Excel模板的函数,然后在C++Builder组件的事件过程直接调用该函数即可。这样一方面可增加程序的可读性,另一方面便于调试和修改。

C++Builder程序中可以调用Excel模板,Excel模板是否被用户关闭就无法直接反馈到C++Builder程序中,如果前次打开的Excel模板没有被关闭,当程序又一次执行调用Excel模板的函数时,Excel板就会被另外再打开一次。为避免Excel板被重复打开,要在C++Builder程序中设置全程变量ExcelExist来记录Excel模板的开关状态,将ExcelExist的初始值设为false。在调用Excel模板文件的函数中设Excel模板开关状态的判断,如Excel Existfalse,说明Excel模板没有被打开,直接调用Excel模板即可,同时将Ex celExist设为trueExcelExisttrue说明Excel模板已经被打开,则利用函数 Ex.OleFunction("Quit")先关闭Excel板,然后再打开Excel模板,显示新数据。


本文来源:https://www.wddqw.com/doc/4af0bac182c758f5f61fb7360b4c2e3f57272500.html