我这里有一个初步实现的例子。
//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;