呵呵,我知道如何生成EXCEL报表,现在我的想法是反过来做。(50分)

  • 主题发起人 主题发起人 huangtong
  • 开始时间 开始时间
H

huangtong

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,我知道如何生成EXCEL报表,现在我的想法是反过来做。
要实现读入EXCEL的格式,
1、在EXCEL 里设计好报表的样式,然后用DELPHI读入格式
格式的读入(包括有合并单元格的,读出时,可是再现设计过的
报表,)我的想法是:用数据库来保存报表信息,比如:合并的单元格
我记录下合并单元格的区域,然后读取信息时,调用EXCEL自己的
方法RANGE.MERGE[A1:A2]来合并。
现在请高手指点一下,如何知道EXCEL某格单元格是合并的。
或者指点一二,如何实现用数据库保存报表格式,然后
读出的时候,还原它。
 
难道没有人帮助么?
 
这样做太麻烦,采用别的办法吧,比如直接用程序调用EXCEL模板文件,往里面填数据,
保存EXCEL文件也可以呀。
 
需要那么麻烦吗?直接保存Excel文件多简单
 
to zyg_zm,:
如果是这样的话,不方便于程序的发布,
总不能在程序包里,带上一堆堆的EXCEL报表吧。
 
to huangtong,带上一堆EXCEL报表有什么大不了的,你要发布的话,总得有一些附带文件(BDE或MDAC)
你自己的程序也不会就一个EXE吧,
我原来这样做的时候,我就是吧附带的EXCEL文件改个名字,用.sys做后缀名,谁也不敢随便删除。
再说,别人要用你的程序,EXCEL总得装吧,你能做到多干净,除非你连EXCEL的安装程序也一起做,那才干净。
 
使用vba就可以得到单元格的所有信息,然后把这信息保存到数据库中,
可以做到的,不过有点麻烦而已.
单元格的格式可以用字符串的形式保存在数据库中.
 
to hbezwwl:
其实,报表做好模本,然后数据库保存SQL语句,是比较好的方法,编程比较简单
可是我不想发布程序的时候带一堆堆的EXCEL报表
麻烦就麻烦点,可以告知如何实现么?
 
sorry
别说 excel了,我连access类的东西都很少触及
帮你提前
 
我只是认为可以实现的,我也没有做过.
对不起.
 
那如何利用VBA实现读取单元格的所有信息啊。
 
抛开你的技术问题先不谈,我个人认为这样设计反而不合理
如果报表经常或者有时有改动呢,你怎么做?!还要做程序负责维护你保存在数据库里的数据
而更好的办法应该是把报表文件直接发布打包//用安装程序负责
以后升级或改动也只是将报表文件更新而已
接下来说VBA问题,我以前做过VBA程序。关于RANGE问题要反过来看,
EXCEL里有Range Object的,而从CELL里判断是否RANGE是不对的
道理很简单,你做过EXCEL就知道,有时一个CELL是若干RANGE的交合的CELL的
至于具体的RANGE问题,你可以参见MSDN里的文档,也不是一句话说的清楚的
 
to onedot:
听君一席话,受益菲浅啊。不知,能不能提供一个报表设计比较合理的例子
比如:如何维护报表,如何维护产生报表数据的SQL等等
不甚感激
mail:echo_delphi@x263.net
 
一个Excel模板只有20多K,可以先设计好,然后做为Blob存入数据库,
在需要时从数据库中取出,存成临时文件,就可以引用Excel模板了,
发布程序时,连带数据一起发布,这好象没有什么难度。维护起来也
方便很多,不过我还是喜欢用单独的文件模板。
 
to Demander:
可以给个DEMO让我研究一下么?
 
我这里有一个初步实现的例子。
//Excel报表的打印
procedure TFmain.Print_Excel(RepID:string);
var
eaImport : TExcelApplication;//
ewbImport : TExcelWorkbook;
// v
sheet : TExcelWorksheet;
//sheet
I,J,IrowCount,tempPos:Integer;//
tempSQL,tempField,PreField:string;//临时变量
SqlStr,FileName,FieldStr:string;
StartCol,StartRow:integer;
begin
//根据报表号找出SQL语句
//设计一张表,保存报表的基本数据
with Q1do
begin
close;
sql.Clear;
tempSQL:='select * from syspz_Report where reportId=' + RepId;
sql.Add(tempSQL);
open;
IRowCount:=RecordCount;
if IRowCount=0 then
begin
ShowMess('没有该报表的记录,请确认是否添加了该报表');
exit;
end;
SqlStr :=Tblobfield(fieldByName('SqLStr')).asstring;
FieldStr:=FieldByName('FieldStr').asstring;//显示字段的字符串
FileName:=FieldByName('Path').AsString;
//文件名
StartCol:=FieldByName('StartCol').AsInteger;//起始列
StartRow:=FieldByName('StartRow').AsInteger;//起始行
end;

//往EXCEL写入数据
with q1do
begin
close;
sql.Clear;
sql.Add(SqlStr);
Open;
IrowCount:=RecordCount;
if IRowCount=0 then
begin
ShowMess('该报表现在暂时没有你要的数据');
exit;
end;

//打开已存在的报表,插入数据
eaImport := TExcelApplication.Create(Application);
try
eaImport.ConnectKind := ckNewInstance;
eaImport.Connect;
except
showmess('请先安装 Excel !');
eaImport.Free;
Exit;
end;
try
eaImport.Workbooks.Open(FileName,null,null,null,null,null,null,null,null,null,null,null,null,0);
eaImport.Visible[1] := true;
except
eaImport.Disconnect;
eaImport.Quit;
eaImport.Free;
showmess('无法打开文件!');
Exit;
end;
try
ewbImport := TExcelWorkbook.Create(Application);
sheet := TExcelWorksheet.Create(Application);
SBar.panels[0].text:='正在读取数据...';
ewbImport.ConnectTo(eaImport.Workbooks[1]);
sheet.ConnectTo(ewbImport.Worksheets[1] as _Worksheet);
first;
//用循环取字符串的字段,然后插入到EXCEL表里
For i:=0 to IRowCount-1do
begin
j:=0;
tempField:=FieldStr;
//取要显示的字符串
while tempField<>''do
begin
tempPos:=pos(',',tempField);
PreField:=copy(tempField,1,TempPos-1);
sheet.cells.Item[StartRow+i,StartCol+j]:=FieldByname(PreField).asstring;
tempField:=copy(tempField,tempPos+1,length(tempField));
inc(j);
end;
//while
next;
end;
//for
//*************************************************************************
//给数据加上边框
sheet.Range[sheet.Cells.Item[StartRow,StartCol],sheet.Cells.Item[StartRow+IRowCount,StartCol+J-1]].Borders.LineStyle :=1;
{sheet.Range[sheet.Cells.Item[4,4],sheet.Cells.Item[6,6]].Borders.LineStyle :=2;
sheet.Range[sheet.Cells.Item[5,2],sheet.Cells.Item[5,2]].Borders[1].LineStyle :=3;
sheet.Range[sheet.Cells.Item[5,2],sheet.Cells.Item[5,2]].Borders[2].LineStyle :=4;
sheet.Range[sheet.Cells.Item[5,2],sheet.Cells.Item[5,2]].Borders[3].LineStyle :=5;
sheet.Range[sheet.Cells.Item[5,2],sheet.Cells.Item[5,2]].Borders[4].LineStyle :=6;
sheet.Range[sheet.Cells.Item[5,2],sheet.Cells.Item[5,2]].Borders[5].LineStyle :=7;
sheet.Range[sheet.Cells.Item[5,2],sheet.Cells.Item[5,2]].Borders[6].LineStyle :=8;}
sheet.Disconnect;
ewbImport.Disconnect;
eaImport.Disconnect;
eaImport.Quit;
sheet.Free;
ewbImport.Free;
eaImport.Free;
SBar.panels[0].text:='数据读取完毕。';
except
eaImport.Disconnect;
eaImport.Quit;
eaImport.Free;
showmess('文件读取错误!');
end;
//try
end;
//with
end;
 
多人接受答案了。
 
后退
顶部