VFP与Excel协同设计应用系统报表研究

时间:2022-09-16 04:36:13

VFP与Excel协同设计应用系统报表研究

摘要:给出了VFP进行报表设计时,如何利用Excel表格模板和VFP调用Excel工作簿对象进行复杂报表设计的方法以及相应的程序模块,为VFP与EXCEL进行协同设计应用系统报表提供了一种有效的方法。

关键词:VFP报表;Excel模板;协同程序设计

中图分类号:TP317文献标识码:A文章编号:1009-3044(2011)20-4899-03

The Report Design was Made by Excel Template in the VFP Application System

ZHU Yang-qing

(The School of Electron and Information Engineering, Foshan University, Foshan 528000, China)

Abstract: During the VFP report design, how to use Excel template and Excel workbook object in the VFP, the complicated report design method and its program were given in this paper. An effective method of VFP application report form design with VFP and Excel was given in the VFP application system.

Key words: VFP report; Excel template; coordination programming

在应用系统中开发报表是一项重要的工作。在VFP(本文指VFP 6.0以上版本,下同)中进行报表设计时可以使用传统的程序设计和报表设计器工具两种方法。在VFP中还可以直接调用Excel应用程序对象,然后通过调用Excel 的方法和属性来实现表格的制作和数据传递,但这需要了解很多Excel的属性和方法。而利用Excel强大的制表功能形成表格模板,然后在VFP中把Excel作为应用程序对象进行调用,则可以快速制作出精美的报表。本文通过制作学生成绩报表,介绍这一过程的实现。

1 数据表的设计

本文涉及到两种数据表,一个是保存班级名称的数据表,只包含“班级名称”一个字段,本文该文件名为BJMC.DBF;另一种存放各班级学生成绩的数据表,包含学号、姓名以及各门功课的成绩(本文有高数、英语、普化、政治、电脑、物理6个字段,各个记录数据已保存在数据表中)和平均字段,平均字段成绩通过程序计算得出。为方便操作,每个班级学生成绩数据表的文件名与BJMC.DBF中的相应记录的“班级名称”一样。

2 Excel 模板设计

在Excel中制作如图1所示的模板。关键步骤如下:

1) 表格标题“学生成绩表”的制作。在Excel工作表sheet1第一行选中报表占用的列数,本文为A1:I1,然后单击格式工具栏的“合并及居中”命令,并进行字体及大小的设置。

2) A2单元输入“班级:”,H2单元输入“日期:”;B2单元中由程序自动填入班级名称,I2单元中由程序自动填入系统的日期。

3) 在A3:I3输入报表的字段名行。

4) 在B4:B9输入“平均”、“60分以下人数”、“[60,70)”(指大于等于60分小于70分,下同)、“[70,80)”、“[80,90)”、“[90,100]”。并设置该区域的背景色。

5) 在A10输入“单位:”、B10 输入“教务处”、H10输入“制表:”、I10输入制表人,如本文为“朱扬清”。

6) 将该文件保存为Excel模板文件。本文该文件名为XSCJMB.XLT。

需要填入的具体记录数据,由程序根据VFP数据库表中每一班级学生数量自动插入。图1报表如果在VFP中进行设计则是非常复杂的。

3 将VFP数据传递给Excel

为方便用户操作,设计一个表单,如图2所示。通过表单选择相应的班级,然后,单击“预览”按钮进行预览或者单击“打印”按钮进行打印,单击“退出”按钮则退出该系统。

3.1 表单各对象属性的设置

表单Form1的Caption属性为:打印学生成绩。

三个命令按钮的Caption属性分别为:预览、打印、退出。

标签Label1的Caption属性为:请选择班级。

组合框Combo1的RowRourceType属性为:5-数组,RowRource属性为:BJ。BJ数组由Form1的Init事件代码创建。

3.2 事件代码设计

为高效完成在VFP中调用Excel 模板进行报表设计,需要对表单Form1的Init事件、三个命令按钮的Click事件设置程序代码。

3.2.1 Form1的Init事件代码

该事件由以下两行代码组成,主要功能是定义全局数组BJ,通过SELECT查询命令将BJMC数据表的值复制到BJ数组中,以便其它事件代码中调用。

public bj (6) &&定义全局数组变量,数组元素的个数任意指定

select * from bjmc into array bj &&根据数据表的记录个数确定数组元素个数.

3.2.2 “预览”按钮的Click事件代码

该事件代码的主要功能是通过组合框选择班级名称,然后经宏代换打开相应的班级学生成绩数据表;完成平均成绩的计算和各个分数段学生成绩的统计;创建Excel 对象,打开前面创建的Excel 模板,并根据班级学生成绩中的记录向其中插入空行以及传递各记录数据,在Excel 中浏览数据8秒后关闭Excel,返回图2表单。VFP调用Excel模板创建的报表如图3所示。

该事件代码如下:

*打开数据表,并进行平均值等的计算

aa=bo1.value&&将组合框选定的值赋值给变量aa

use &aa &&经宏代换转换,打开选定的数据表

repl all 平均 with (高数+英语+普化+政治+电脑+物理)/6

dimension pj(7)

sele avg(高数),avg(英语),avg(普化),avg(政治),avg(电脑),avg(物理),avg(平均) from &aa into array pj

dimension SJB(6,6) &&二维数组的元素个数任意确定

sele 学号,姓名,高数,英语,普化,政治,电脑,物理,平均 from &aa into array sjb;

&&根据数据表的记录个数和所选字段数确定二维数组的元素个数,并将数据表的指定字段的记录数据传递给数组

dimension tj(5,6)&&定义保存各门功课各个分数段数据的数组.

*进行各门功课各个分数段的统计计算

for i=1 to 5

for j=1 to 6

tj(i,j)=0

next j

next i

for i=1 to reccount()

for j=3 to 8

do case

case sjb(i,j)

tj(1,j-2)=tj(1,j-2)+1

case sjb(i,j)

tj(2,j-2)=tj(2,j-2)+1

case sjb(i,j)

tj(3,j-2)=tj(3,j-2)+1

case sjb(i,j)

tj(4,j-2)=tj(4,j-2)+1

otherwise

tj(5,j-2)=tj(5,j-2)+1

endcase

next j

next i

*创建Excel对象,打开模板,设置Sheet1为当前工作表

bb=createobject('excel.application') &&创建Excel 对象

bb.visible=.t. &&使刚创建的Excel对象可视

bb.workbooks.add('d:\xscj\xscjmb.xlt') &&打开前面创建的Excel模板文件

bb.worksheets('sheet1').activate &&激活模板文件的Sheet1为当前工作表

bb.caption="VFP与Excel设计报表"&&设置当前打开的Excel模板报表文件的标题

*在Excel中插入填加学生成绩需要的空行

for i=1 to reccount()

bb.activesheet.rows(4).insert

next i

*传递数据给Excel

bb.cells(2,2)=bo1.value

bb.cells(2,9)=date()

for i=1 to reccount()

for j=1 to 9

bb.cells(i+3,j)=sjb(i,j)

next j

next i

for j=1 to 7

bb.cells(i+3,j+2)=pj(j)

endfor

hs=i+3

for i=1 to 5

for j=1 to 6

bb.cells(hs+i,j+2)=tj(i,j)

next j

next i

*预览Excel报表数据,8秒后自动关闭

wait "" timeout 8&&浏览Excel报表数据,等待8秒后返回

bb.activeworkbook.saved=.t. &&不保存Excel文件

bb.workbooks.close&&将Excel关闭

bb.quit &&退出Excel

3.2.3 “打印”按钮Click事件代码

该事件代码与“预览”按钮的Click事件代码基本一样,只是在打印时不想看到Excel窗口出现,将bb.visible=.t. 语句改为:bb.visible=.f .即可,另外再将

wait "" timeout 8&&浏览Excel报表数据,等待8秒后返回

改为:

bb.activeworkbook.printout(1,1,1,.f.)&&打印当前工作簿的第1个工作表,1份,不预览.

即可

3.2.4 “退出”按钮的Click 事件代码

close table all && 关闭已打开的数据表

thisform.release &&退出表单

通过在VFP中调用Excel模板来制作复杂表格的方法,对于在VFP应用系统中制作复杂报表非常有效。给出的“学生成绩打印表”的设计过程及有关程序代码,稍微修改一下该程序代码的有关参数,就可以适合其他应用系统报表的输出。

本文的程序代码在VFP 6.0以上版本和Excel 2000以上版本通过调试

参考文献:

[1] 朱珍.Visual FoxPro数据库程序设计[M].北京:中国铁道出版社,2008.

[2] 徐尔贵,富莹伦.Visual FoxPro 面向对象数据库教程[M].北京:电子工业出版社,2006.

[3] Walkenbach J.Excel 2002公式与函数应用[M].路晓春,译.北京:电子工业出版社,2002.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:短信调用系统的设计和实现 下一篇:Python多线程机制初探