DELPHI制作复杂报表实例,特别推荐!
2007-11-15 11:01
489 查看
我近段时间一直在做各种各样的报表,特别是那些复杂报表,如下图所示:
像这类报表若说用第三方控件,说实在,你还得重做一次表,你做的又不一定符合人家原来做的要求,若用用友软件,那得交一笔不小的数目的钱哦!可我们公司一直要求以最小的投入获取最大的回报,所以是不可能的,后面想想,他们是用EXCEL做成的表给我的,我为什么不可以直接调用它们的表呢,我只要把这些表做成模板再与数据库相连,便可实现了,后来就按这方案去进行了,结果当然是搞定了,现在公布出来与大家共享,当然,对与高手而言也许不是怎么高的水平,但我相信会对部分人有用的,像这类报表做的思想就是:!一.定义各类数据的行列;二,连接模板;三,按要求进行相关的数据提取和相关的运算,对于数据运算一定要尽量想到EXCE的强大的运算功能,只要它能帮解决的就不要程序里面编写,否则运行起来就不是那么快了,相关代码如下:
procedure Tdp_bb.dp_okClick(Sender: TObject);
var
cbw,zbw,wbw,rjw,ph,ExeRootPath:string;
i,j,k:integer;
t1,t2:Ttime;
begin
rjw:=trim(datetostr(dp_dtp.Date));
cbw := trim(dp_cbbc.Text);
zbw := trim(dp_cbbz.Text);
wbw := trim(dp_cbbw.Text);
t1:=0;
t2:=0;
if (cbw<>'') and (zbw<>'') and (wbw<>'') then
begin
try
ChDir(ExtractFilePath(Application.ExeName));
ChDir('..');
ExeRootPath := GetCurrentDir;
dp_exapt.Connect;
dp_exapt.Visible[0]:=false;
dp_exapt.Workbooks.Add(ExeRootPath+'/config/sjcs.xls',0);
dp_exwb.ConnectTo(dp_exapt.Workbooks[1]);
dp_exws.ConnectTo(dp_exwb.Sheets[1] as _worksheet);
j:=6;//起始行初始化
with dp_form.dp_adoq1 do
begin
close;
sql.Clear;
sql.Add('select GWDY_SJPH,GWDY_ZTP from TB_GWDY order by GWDY_XH asc');
open;
while not eof do
begin
ph:=fieldbyname('GWDY_SJPH').AsString;
i:=fieldbyname('GWDY_ZTP').AsInteger;
if i=6 then
{时间类型}
begin
{早班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+cbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');
open;
for k:=6 to RecordCount+5 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);
next;
end;
end;
{中班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');
open;
for k:=11 to RecordCount+10 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);
next;
end;
end;
{晚班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');
open;
for k:=16 to RecordCount+15 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);
next;
end;
end;
{月平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' order by YS_XH asc');
open;
while not eof do
begin
t1:=t1+strtotime(trim(fieldbyname('YS_YPTM').AsString));
next;
end;
dp_exws.Cells.Item[j,22]:=timetostr(t1);
t1:=0;
end;
{榨季平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' order by YS_XH asc');
open;
while not eof do
begin
t2:=t2+strtotime(trim(fieldbyname('YS_YPTM').AsString));
next;
end;
dp_exws.Cells.Item[j,23]:=timetostr(t2);
t2:=0;
end;
end
else
{非时间类型}
begin
{早班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+cbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''2:30'',''4:30'',''6:30'',''8:30'','''') order by YS_XH asc');
open;
for k:=6 to RecordCount+5 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);
next;
end;
end;
{中班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''10:30'',''12:30'',''14:30'',''16:30'','''') order by YS_XH asc');
open;
for k:=11 to RecordCount+10 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);
next;
end;
end;
{晚班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''18:30'',''20:30'',''22:30'',''00:30'','''') order by YS_XH asc');
open;
for k:=16 to RecordCount+15 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);
next;
end;
end;
{月平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select avg(YS_YPS) as A from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' group by YS_SJPH');
open;
if not eof then
begin
dp_exws.Cells.Item[j,22]:=trim(fieldbyname('A').AsString);
end;
end;
{榨季平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select avg(YS_YPS) as B from TB_YS where YS_SJPH='''+ph+''' group by YS_SJPH');
open;
if not eof then
begin
dp_exws.Cells.Item[j,23]:=trim(fieldbyname('B').AsString);
end;
end;
end;
j:=j+1;
next;
end;
end;
dp_exws.Cells.Item[2,1] := rjw;
dp_exws.Cells.Item[4,6] := cbw;
dp_exws.Cells.Item[4,11]:= zbw;
dp_exws.Cells.Item[4,16]:= wbw;
bb_tm.Enabled:=true;
except
showmessage('模板路径出错或者是您还没有安装OFFICE办公软件');
close;
end;
end;
end;
以上希望对学DELPHI的人有帮助!只要我拥有的知识一定与大家共享!
像这类报表若说用第三方控件,说实在,你还得重做一次表,你做的又不一定符合人家原来做的要求,若用用友软件,那得交一笔不小的数目的钱哦!可我们公司一直要求以最小的投入获取最大的回报,所以是不可能的,后面想想,他们是用EXCEL做成的表给我的,我为什么不可以直接调用它们的表呢,我只要把这些表做成模板再与数据库相连,便可实现了,后来就按这方案去进行了,结果当然是搞定了,现在公布出来与大家共享,当然,对与高手而言也许不是怎么高的水平,但我相信会对部分人有用的,像这类报表做的思想就是:!一.定义各类数据的行列;二,连接模板;三,按要求进行相关的数据提取和相关的运算,对于数据运算一定要尽量想到EXCE的强大的运算功能,只要它能帮解决的就不要程序里面编写,否则运行起来就不是那么快了,相关代码如下:
procedure Tdp_bb.dp_okClick(Sender: TObject);
var
cbw,zbw,wbw,rjw,ph,ExeRootPath:string;
i,j,k:integer;
t1,t2:Ttime;
begin
rjw:=trim(datetostr(dp_dtp.Date));
cbw := trim(dp_cbbc.Text);
zbw := trim(dp_cbbz.Text);
wbw := trim(dp_cbbw.Text);
t1:=0;
t2:=0;
if (cbw<>'') and (zbw<>'') and (wbw<>'') then
begin
try
ChDir(ExtractFilePath(Application.ExeName));
ChDir('..');
ExeRootPath := GetCurrentDir;
dp_exapt.Connect;
dp_exapt.Visible[0]:=false;
dp_exapt.Workbooks.Add(ExeRootPath+'/config/sjcs.xls',0);
dp_exwb.ConnectTo(dp_exapt.Workbooks[1]);
dp_exws.ConnectTo(dp_exwb.Sheets[1] as _worksheet);
j:=6;//起始行初始化
with dp_form.dp_adoq1 do
begin
close;
sql.Clear;
sql.Add('select GWDY_SJPH,GWDY_ZTP from TB_GWDY order by GWDY_XH asc');
open;
while not eof do
begin
ph:=fieldbyname('GWDY_SJPH').AsString;
i:=fieldbyname('GWDY_ZTP').AsInteger;
if i=6 then
{时间类型}
begin
{早班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+cbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');
open;
for k:=6 to RecordCount+5 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);
next;
end;
end;
{中班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');
open;
for k:=11 to RecordCount+10 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);
next;
end;
end;
{晚班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');
open;
for k:=16 to RecordCount+15 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);
next;
end;
end;
{月平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' order by YS_XH asc');
open;
while not eof do
begin
t1:=t1+strtotime(trim(fieldbyname('YS_YPTM').AsString));
next;
end;
dp_exws.Cells.Item[j,22]:=timetostr(t1);
t1:=0;
end;
{榨季平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' order by YS_XH asc');
open;
while not eof do
begin
t2:=t2+strtotime(trim(fieldbyname('YS_YPTM').AsString));
next;
end;
dp_exws.Cells.Item[j,23]:=timetostr(t2);
t2:=0;
end;
end
else
{非时间类型}
begin
{早班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+cbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''2:30'',''4:30'',''6:30'',''8:30'','''') order by YS_XH asc');
open;
for k:=6 to RecordCount+5 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);
next;
end;
end;
{中班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''10:30'',''12:30'',''14:30'',''16:30'','''') order by YS_XH asc');
open;
for k:=11 to RecordCount+10 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);
next;
end;
end;
{晚班数据位置}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''18:30'',''20:30'',''22:30'',''00:30'','''') order by YS_XH asc');
open;
for k:=16 to RecordCount+15 do
begin
dp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);
next;
end;
end;
{月平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select avg(YS_YPS) as A from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' group by YS_SJPH');
open;
if not eof then
begin
dp_exws.Cells.Item[j,22]:=trim(fieldbyname('A').AsString);
end;
end;
{榨季平均}
with dp_form.dp_adoq2 do
begin
close;
sql.Clear;
sql.Add('select avg(YS_YPS) as B from TB_YS where YS_SJPH='''+ph+''' group by YS_SJPH');
open;
if not eof then
begin
dp_exws.Cells.Item[j,23]:=trim(fieldbyname('B').AsString);
end;
end;
end;
j:=j+1;
next;
end;
end;
dp_exws.Cells.Item[2,1] := rjw;
dp_exws.Cells.Item[4,6] := cbw;
dp_exws.Cells.Item[4,11]:= zbw;
dp_exws.Cells.Item[4,16]:= wbw;
bb_tm.Enabled:=true;
except
showmessage('模板路径出错或者是您还没有安装OFFICE办公软件');
close;
end;
end;
end;
以上希望对学DELPHI的人有帮助!只要我拥有的知识一定与大家共享!
相关文章推荐
- 复杂报表的制作
- 6 款常用的Java开源报表制作工具推荐
- 使用dataexcel制作复杂报表
- iReport 4.1 报表制作,子报表,实例解析
- 在线报表设计实战系列 – ④制作复杂表头报表
- Access如何制作复杂报表——利用Excel输出复杂报表
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到excel的组件实例)
- 推荐6款常用的Java开源报表制作工具
- iReport 4.1 报表制作,子报表,实例解析
- 我要做delphi报表请问要从哪儿着手!请高手指点!有没有一些实例或者教程!
- 推荐6款常用的Java开源报表制作工具
- Delphi中用FastReport制作报表
- 用Delphi制作中国式报表
- Delphi DBGridEh标题栏的制作(复杂标题栏、标题栏显示图片、按点标题栏进行排序)
- 推荐6款常用的Java开源报表制作工具
- 推荐6款常用的Java开源报表制作工具
- Access利用excel制作复杂报表的方法
- 一个复杂引用的实例『只可以作为参考,此程序写法不推荐』
- 用Delphi制作中国式报表
- MongoDB报表实例方案选型 推荐