导出为excel表: procedure TForm3.Excel4Click(Sender: TObject); //将联合查询的结构转为excel表 var xlsFilename :string; eclApp,WorkBook :variant ; a_filedNo,i,j :integer; begin a_filedNo :=Form3.DBGrid4.FieldCount ; xlsFileName :='关于学生成绩基本信息.xls'; try eclApp :=CreateOleObject('Excel.Application'); WorkBook :=CreateOleObject('Excel.Sheet'); except showmessage('您的系统没有安装MS EXCEL'); exit; end; try WorkBook :=eclApp.workBooks.add ; for i :=1 to a_FiledNo do //转化字段名; begin //eclApp.cells(1,i) :=Form3.DBGrid4.Columns[i-1].Title.caption ; eclApp.cells(1,i) :=Form3.DBGrid4.Fields[i-1].FieldName ; end; Form3.DBGrid4.DataSource.DataSet.First ; for i :=1 to Form3.a_recno do //Form3.a_recno begin for j :=1 to a_filedNo do //转化一个记录 begin eclApp.cells(i+1,j) :=Form3.DbGrid4.Fields[j-1].Value ; end; Form3.DBGrid4.DataSource.DataSet.Next ; end; try WorkBook.saveas(ExtractFilePath(Application.ExeName )+xlsFileName); WorkBook.close; showmessage('保存EXECL文件成功,路径为:'+ExtractFilePath(Application.ExeName )+xlsFileName); except showmessage('保存文件出错'); end; except showmessage('不能正确操作EXECL文件,可能该文件已经被其他程序占用或系统错误'); WorkBook.close; eclApp.quit; eclApp :=Unassigned; end; end;
//将任何数据集中的数据导入到EXCEL中,函数执行后打开EXCEL并开始导入数据,可在EXCEL中自己保存文件,也可以在函数中修改直接保存为EXCEL文件而无须打开EXCEL。.. uses comobj,db; .. function dte(const data:TDataSet):OLEVARIANT; var eclapp,workbook:OLEVARIANT; i,column,row:integer; begin //将数据集中的数据导入到EXCEL中 screen.cursor:=crhourglass; if data.RecordCount<>0 then begin try begin eclapp:=createoleobject('excel.application'); eclapp.visible:=true; workbook:=createoleobject('excel.sheet'); end except showmessage('你的EXCEL还未正确安装!!!'); screen.cursor:=crdefault; exit; end; workbook:=eclapp.workbooks.add; row:=2; eclapp.workbooks.item[1].activate; eclapp.cells.font.colorindex:=5; for i:=1 to data.FieldCount do eclapp.cells(row,i):=data.fields[i-1].DisplayLabel; data.first; while not data.Eof do begin column:=1; for i:=1 to data.FieldCount do begin eclapp.cells.item[row+1,column]:=data.fields[i-1].asstring; column:=column+1; end; data.next; row:=row+1; end; screen.cursor:=crdefault; end; end;
1.1 编写目的
为了把数据库中的数据导入到Excel,方便、迅速的打印。
1.2 项目背景
使用Excel对数据和报表强大的处理功能。参考了Ereport中国式的报表控件的结构和处理方法。
1.3 定义
Excel对数据和报表的处理功能强大,为了方便灵活的把数据从其它数据库中导入到Excel,利用Excel本身的功能打印报表而写的控件。令报表设计轻松快捷。实现所见即所得,即打即排。实现报表与软件分开,让用户可以自己设计自己的报表方案。
2. 总体设计
1. 1 需求概述
1.使用简便、易于理解和操作。
2.提供较好的灵活性满足数据导入到Execl的需求。
1. 2 控件结构
1.对变量的处理。
2.对数据集的处理。
3.扫描Execl模板生成.xsl格式的数据文件报表。
3. 程序功能设计.
控件名称 ReportExcle
控件版本 1.0.0.0
属性部分
属性名称 类型 描述
Name String 控件名称
ReportFile TList 选择报表模板名称
Tag Int 控件标志
方法部分
方法名称 参数 描述
SetDataSet strDatasetName: string;pDataSet: TDataSet 指定报表模板中的数据集变量名
SetVarValue strVarName: string strVarValue: string 设置报表模板中的字符变量内容
PrintPreview bPreviewMode: Boolean 是否执行4. Excel编辑报表模板。模板编辑约定。
1。`+变量名称。例如:`date,自定的变量。
2。#+数据集名称+.+数据表字段名称。例如:#UserQry.username。
l `号开头的是变量,通过SetVarValue来赋值。
l #号开头的是主表的表名及字段名,通过SetDataSet来赋值。
l `date,`time,`datetime为控件变量,分别表示打印的日期和时间。
5. 输入的接口
1. 设置要使用报表模板的文件名,调用控件的ReportFile属性。
2. 设置报表模板中的数据集变量名,调用控件的SetDataSet方法。
2。设置报表模板中的字符变量内容,调用控件的SetVarValue方法。
6. 输出的接口
1. 打印预览。控件PrintPreview方法,检查系统有没有安装MicroSoft EXCEL软件,没有安装就退出,安装了就调用ReportFile属性里设置的对应Excel模板,开始对每一单元格扫描生存报表,是`开头的写入报表对应SetVarValue来赋值的变量的值,是#开头的分解得到数据集名和字段名从对应的数据库中取出数据写入报表,不是二者的直接写入报表,行数根据数据集的记录数目来确定。生成。Xsl文件的数据文件后,是否保存,是否打印,等用户自行对Excel进行操作。
7. 控件内部结构。
1. 用TvarTableItem结构体保存所有变量的名字和值的对照表。
2. 用TDatasetItem结构体保存所有数据集的指针和名称的对照
3. 扫描报表模板单元格是根据变量的名或者数据集变量从结构体取出向应的值和名称,根据数据记录数目生成相同行数的Excel报表。
我给你发东西过来,再给你发个任何查询的打印模板
procedure TForm3.Excel4Click(Sender: TObject); //将联合查询的结构转为excel表
var xlsFilename :string;
eclApp,WorkBook :variant ;
a_filedNo,i,j :integer;
begin
a_filedNo :=Form3.DBGrid4.FieldCount ;
xlsFileName :='关于学生成绩基本信息.xls'; try
eclApp :=CreateOleObject('Excel.Application');
WorkBook :=CreateOleObject('Excel.Sheet');
except
showmessage('您的系统没有安装MS EXCEL');
exit;
end; try
WorkBook :=eclApp.workBooks.add ;
for i :=1 to a_FiledNo do //转化字段名;
begin
//eclApp.cells(1,i) :=Form3.DBGrid4.Columns[i-1].Title.caption ;
eclApp.cells(1,i) :=Form3.DBGrid4.Fields[i-1].FieldName ;
end; Form3.DBGrid4.DataSource.DataSet.First ;
for i :=1 to Form3.a_recno do //Form3.a_recno begin
for j :=1 to a_filedNo do //转化一个记录
begin
eclApp.cells(i+1,j) :=Form3.DbGrid4.Fields[j-1].Value ;
end;
Form3.DBGrid4.DataSource.DataSet.Next ;
end;
try
WorkBook.saveas(ExtractFilePath(Application.ExeName )+xlsFileName);
WorkBook.close;
showmessage('保存EXECL文件成功,路径为:'+ExtractFilePath(Application.ExeName )+xlsFileName);
except
showmessage('保存文件出错');
end;
except
showmessage('不能正确操作EXECL文件,可能该文件已经被其他程序占用或系统错误');
WorkBook.close;
eclApp.quit;
eclApp :=Unassigned;
end;
end;
uses comobj,db;
..
function dte(const data:TDataSet):OLEVARIANT;
var
eclapp,workbook:OLEVARIANT;
i,column,row:integer;
begin //将数据集中的数据导入到EXCEL中
screen.cursor:=crhourglass;
if data.RecordCount<>0 then begin
try
begin
eclapp:=createoleobject('excel.application');
eclapp.visible:=true;
workbook:=createoleobject('excel.sheet');
end
except
showmessage('你的EXCEL还未正确安装!!!');
screen.cursor:=crdefault;
exit;
end;
workbook:=eclapp.workbooks.add;
row:=2;
eclapp.workbooks.item[1].activate;
eclapp.cells.font.colorindex:=5;
for i:=1 to data.FieldCount do
eclapp.cells(row,i):=data.fields[i-1].DisplayLabel;
data.first;
while not data.Eof do
begin
column:=1;
for i:=1 to data.FieldCount do
begin
eclapp.cells.item[row+1,column]:=data.fields[i-1].asstring;
column:=column+1;
end;
data.next;
row:=row+1;
end; screen.cursor:=crdefault;
end; end;