基于Delphi的Excel动态报表技术

摘  要  本文针对在Delphi中设计输出报表所遇到的问题,引用编程环境中提供的Excel对象,编程控制Access中的数据输出到Excel对象中,使基于任意数据表或查询的各种复杂报表的制作问题得到了解决。并通过具体项目开发实例详细阐述了基于Delphi的Excel动态报表制作技术。

    关键词  Delphi;Access;Excel;动态报表
 

 

1  引言

    在管理类软件中的使用中,用户总希望对一些有用的数据生成报表,一些高级语言开发工具都提供报表的制作功能,它们通常都是使用报表制作向导或设计器,事先摆放好字段位置,然后建立与数据表的绑定关系,从而生成报表。但对于一个通过SQL语句动态生成的数据表制作报表就难以完成了。Delphi作为一种优秀的可视化开发工具,在Servers页中提供了ExcelApplication、ExcelWorkbook和ExcelWorksheet组件,通过这几个组件可以建立与数据库的连接,使用Delphi编程控制Access数据库中的数据输出到Excel对象中,把需要打印的内容输出到Excel文件,借助Excel输出报表,成功实现了动态报表的制作。下面结合《学生成绩管理系统》,详细介绍在Delphi中使用Excel制作动态报表的方法。本例中使用的是Access数据库。

2  实现技术

    通过“报表”菜单项打开一个窗体,在此窗体上选择数据表及字段,设置字段值的范围,编程形成条件,通过SQL语句生成数据表,导入Excel工作表中,完成动态报表的生成及打印功能。

2.1  使用ADO访问数据库

    创建一窗体form1,添加ADOConnection、ADOQuery和DataSource组件,在TForm1.FormCreate事件中通过ADO建立Delphi应用程序与Access数据库的连接。Delphi中Access数据库与ADO的连接语句:
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0 ; Data Source=包含路径的数据库名; Persist Security Info=FALSE';
adoconnection1.Open;
ADOQuery1.Connection:=ADOConnection1;

2.2  引用Excel对象

    在窗体上添加ExcelApplication、ExcelWorkbook、ExcelWorksheet组件,定义全局变量:
 ExcelApp:TExcelApplication;//用来连接Excel应用程序
 ExcelWkbook:TExcelWorkbook;//定义工作薄变量
 ExcelWksheet:TExcelWorksheet;//定义Excel工作表变量

2.3  设置条件,生成报表

    可以使用列表框添加所需要的数据表,并找到所需要的字段,设置各种复杂的条件,根据设置的条件使用SQL查询语句,把满足条件的记录导到Excel中,为了形成的报表具有一定的格式,可以先对一个空Excel文件设置好格式,作为模板文件,导入数据后,再以想要的文件名另存文件。可以在窗体上添加一个按钮,标题为“生成报表”,并通过文本框控件输入文件名。生成报表后以文本框中的内容作为文件名并保存。通过单击按钮生成Excel工作簿文件,用户可以打开工作簿文件进行打印预览、打印等操作。保存的具体实现语句为:
    ExcelWksheet.SaveAs('e:/delphi/'+edit1.text);//保存文件

2.4  代码实现

定义变量:
  ExcelApp:TExcelApplication;//用来连接Excel应用程序
  ExcelWkbook:TExcelWorkbook;//工作薄
  ExcelWksheet:TExcelWorksheet;//Excel数据表
  i,j:integer;
生成报表按钮单击事件:
procedure TForm1.ButtonCreateClick(Sender: TObject);
begin
   ExcelApp:=TExcelApplication.Create(Application);//创建Excel应用
   ExcelWkbook:=TExcelWorkbook.Create(Application);//创建工作薄
   ExcelWksheet:=TExcelWorksheet.Create(Application);//创建工作表
   ExcelApp.Connect; //连接Excel应用程序
   excelapp.Visible[0]:=true;
   ExcelApp.WorkBooks.Open('e:/delphi/Nomalexcelbook1.xls',EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0); //打开模板文件
   ExcelApp.ActiveWorkbook; //设置活动工作簿
   Excelapp.ActiveSheet; //设置活动工作表
   ExcelWkbook.ConnectTo(ExcelApp.Workbooks[1]); //工作簿与Excel应用程序连接
   ExcelWksheet.ConnectTo(ExcelWkbook.Worksheets[1] as _worksheet); //工作表与工作簿连接
   AdoQuery1.First;  
 for j:=0 to AdoQuery1.Fields.Count-1 do // 先写字段名
  begin
   ExcelWksheet.Cells.item[1,j+1]:=AdoQuery1.Fields[j].Dis playLabel; // Cells对象:表示工作表的一个单元格。
   ExcelWksheet.Cells.item[1,j+1].font.size:=10;
  end;
  for i:=2 to AdoQuery1.RecordCount+1 do // 一共要读AdoQuery1.RecordCount-1条记录
   begin
    for j:=0 to AdoQuery1.Fields.Count-1 do
     begin
      ExcelWksheet.Cells.item[i,j+1]:=AdoQuery1.Fields[j]. Asstring; //写入记录
     end;
     AdoQuery1.Next;
  end;
  ExcelWksheet.Columns.AutoFit; //列自适应
  ExcelWksheet.SaveAs('e:/delphi/'+edit1.text); //按用户提供的文件名保存文件
ExcelApp.Disconnect;
  buttonCreate.Enabled:=false;
end;
窗体的生成事件代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:/delphi/xsxx.MDB;Persist Security Info=FALSE';
   adoconnection1.Open;
   ADOQuery1.Connection:=ADOConnection1;
   AdoQuery1.SQL.Text:='Select * from xscjb';//可以选择表进行多表查询
   AdoQuery1.Active:=True ;
   DataSource1.DataSet:=AdoQuery1;
   ButtonCreate.Enabled:=false;
end;
编辑框改变时,“生成报表”按钮可用,事件代码:
procedure TForm1.Edit1Change(Sender: TObject);
begin
ButtonCreate.Enabled:=true;
end;
窗体退出时代码:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ExcelApp.Quit;
 ExcelApp.Free; //释放变量
 ExcelWkbook.Free; //释放变量
 ExcelWksheet.Free;// 释放变量
end;
此代码在Delphi 6.0、Access2000及Excel2000环境下调试成功。

3  结束语

    报表是管理系统类软件中不可缺少的组成部分,在开发《学生成绩管理系统》时,遇到一些动态生成的数据表,需要生成报表,使用Delphi提供的报表功能难以实现,本系统引入Excel对象,把通过SQL动态生成的数据表导入Excel文件中,并且保存,用户可以打开Excel文件,按照自己的要求设置报表的外观,进行预览或打印。在Delphi中引入Excel对象,成功解决了Access中动态生成的数据表的报表制作问题,为Delphi中各类具有特殊格式的复杂报表的制作提供了参考依据。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值