如何在delphi中把需要打印的内容输出到excell中,急需例子和源码 谁能解兄弟燃眉之急,不胜感激!请将相关内容发到:[email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也想要啊,谢谢了,能输出到word上的也行[email protected] 你在csdn上搜索一下,以前有贴子讲得很完善的。 用Word做Delphi报表输出工具 笔者在实际应用中发现,报表的内容一般很少变动,但其字体格式及版式是经常变动的,而且有时用户为了某种需要,不想修改数据库的真实内容而又要改变报表内容。如果用ReportSmith可以解决前者问题,但对于后者则无能为力了,且其界面是英文的,不合用户习惯。如果用3.0中的TQReport的报表部件,则两者都不能实时解决,必须修改原代码后重新编译才能使用。而使用Word及Excel则完全可以克服以上不足。具体实现如下(以Word实现为例): 首先用Word编辑报表格式,并排好版,把将要输出的数据项用表单域代替,并取名。这里我们暂时假设有表单域Item1及Item2(均为文本型),将这个文档存为模板文件Example.dot,然后按如下步骤进行: 1)运行Delphi3,在Form1里加入一个System部件集里的TDdeClientCov部件,取名为DdeExample,将其ConnectMode设为ddeManual(手动方式);将DdeService设为‘(WinWord)’;将ServiceApplication设为‘WinWord’。 2)编写一个自定义过程,以激活Word,如下: procedure Tform1.WordActive(Cmds: TStrings); var WordPath: String; begin if(not DdeExample.OpenLink) then {判断是否巳动态链接} begin if(FindWindow('OpusApp', nil)=0) then begin WordPath := 'C:\msoffice\winword'; if(WordPath='') then ShowMessage('中文Word未安装或未设置路径,请安装设置Word中文 版。') else begin DdeExample.ServiceApplication := WordPath+'\Winword.exe'; if(DdeExample.OpenLink) then {如果巳动态链接执行宏命令} DdeExample.ExecuteMacroLines(Cmds,False) else ShowMessage('无法启动Word中文版!'); DdeExample.ServiceApplication := 'WinWord.exe'; end; end else begin{如果巳动态链接执行宏命令} DdeExample.ExecuteMacroLines(Cmds,False); end; end else DdeExample.ExecuteMacroLines(Cmds,false); end; 在private声明区里加入如下: procedure ActiveWord(Cmds: TStrings); 3)在Form1中加入一个按钮Button1,在其onclick事件里写如下代码: procedure TForm1.Button1Click(Sender: TObject); var Cmds:TStringList;{创建Cmds} TempItem1,TempItem2:String; begin cmds:=TStringList.Create; cmds.Clear; TempItem1:='数据项一'; TempItem2:='数据项二'; with Cmds do begin Clear; Add('[FileNew.Template ="Example.Dot″]');{打开模板文件Example.Dot} Add('[AppMaximize]');{文档最大化} Add('[SetFormResult"Item1″,″'+TempItem1+'″]');{将数据TempItem1传给表单域Item1} Add('[SetFormResult"Item2″,″'+TempItem2+'″]);{将数据TempItem2传给表单域Item2} end; WordActive(DdeExample,Cmds);{调用自定义过程} Cmds.Free;{释放Cmds} end; 运行这个程序,单击Button1,大家可以发现Word被启动了,屏幕上出现了:数据项一;数据项二两个数据项。最后,大家可以任意修改本报表的格式及数据,因为这时这个报表与具体的应用程序巳没有关系了。 本例中用的是中文Word6或中文Word7。由于Word97的宏命令巳变为Visual Basic语句,如大家想用Word97实现,请将其宏命令改变为相应的代码。 这是个简单的示例,大家可以利用Word的宏录制功能,录取更多的宏(如自动生成表格、填充文字、变动字体等宏命令),并与数据库的各种表联系起来,依次加入Cmds中即可实现您所要求的更复杂的功能。 转 我也要一份,谢谢![email protected] //数据导出至excelprocedure TDataModule_public.WriteExcel(AdsData: TTable; sName, Title: string);var ExcelApplication1: TExcelApplication; ExcelWorksheet1: TExcelWorksheet; ExcelWorkbook1: TExcelWorkbook; i, j: integer; filename: string;begin filename := sName; try ExcelApplication1 := TExcelApplication.Create(Application); ExcelWorksheet1 := TExcelWorksheet.Create(Application); ExcelWorkbook1 := TExcelWorkbook.Create(Application); ExcelApplication1.Connect; except Application.Messagebox('Excel 没有安装!', 'Hello', MB_ICONERROR + mb_Ok); Abort; end; try ExcelApplication1.Workbooks.Add(EmptyParam, 0); ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]); ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet); AdsData.First; for j := 0 to AdsData.Fields.Count - 1 do begin ExcelWorksheet1.Cells.item[3, j + 1] := AdsData.Fields[j].DisplayLabel; ExcelWorksheet1.Cells.item[3, j + 1].font.size := '10'; end; for i := 4 to AdsData.RecordCount + 3 do begin for j := 0 to AdsData.Fields.Count - 1 do begin ExcelWorksheet1.Cells.item[i, j + 1] := AdsData.Fields[j].Asstring; ExcelWorksheet1.Cells.item[i, j + 1].font.size := '10'; end; AdsData.Next; end; ExcelWorksheet1.Columns.AutoFit; ExcelWorksheet1.Cells.item[1, 2] := Title; ExcelWorksheet1.Cells.Item[1, 2].font.size := '14'; ExcelWorksheet1.SaveAs(filename); Application.Messagebox(pchar('数据成功导出' + filename), 'Hello', mb_Ok); finally ExcelApplication1.Disconnect; ExcelApplication1.Quit; ExcelApplication1.Free; ExcelWorksheet1.Free; ExcelWorkbook1.Free; end;end; 我写的一个dll中的一个函数高手帮忙看下,错在哪??? 怎么用Delphi控制硬件设备 找不到Wwdbgrid 在delphi中如何编程实现从初始化文件中读出数据信息,然后显示出来? 如何跟踪一个函数? 求MDI文本编辑器源码(在线等,收到马上结帖) TMEMO控件 小小记事本源码发布兼散分 如何判断用户第一次登录? delphi 菜鸟提问 做一个代理服务器软件,代理http、socks5等(有用户管理),技术、结构应该怎么做最好,讨论,来者有分 今天和女朋友讲分手,可是还是很喜欢她;
[email protected]
笔者在实际应用中发现,报表的内容一般很少变动,但其字体格式及版式是经常变动的,而且有时用户为了某种需要,不想修改数据库的真实内容而又要改变报表内容。如果用ReportSmith可以解决前者问题,但对于后者则无能为力了,且其界面是英文的,不合用户习惯。如果用3.0中的TQReport的报表部件,则两者都不能实时解决,必须修改原代码后重新编译才能使用。而使用Word及Excel则完全可以克服以上不足。具体实现如下(以Word实现为例): 首先用Word编辑报表格式,并排好版,把将要输出的数据项用表单域代替,并取名。这里我们暂时假设有表单域Item1及Item2(均为文本型),将这个文档存为模板文件Example.dot,然后按如下步骤进行: 1)运行Delphi3,在Form1里加入一个System部件集里的TDdeClientCov部件,取名为DdeExample,将其ConnectMode设为ddeManual(手动方式);将DdeService设为‘(WinWord)’;将ServiceApplication设为‘WinWord’。 2)编写一个自定义过程,以激活Word,如下:
procedure Tform1.WordActive(Cmds: TStrings);
var
WordPath: String;
begin
if(not DdeExample.OpenLink) then {判断是否巳动态链接}
begin
if(FindWindow('OpusApp', nil)=0) then
begin
WordPath := 'C:\msoffice\winword';
if(WordPath='') then
ShowMessage('中文Word未安装或未设置路径,请安装设置Word中文 版。')
else begin
DdeExample.ServiceApplication := WordPath+'\Winword.exe';
if(DdeExample.OpenLink) then {如果巳动态链接执行宏命令}
DdeExample.ExecuteMacroLines(Cmds,False)
else
ShowMessage('无法启动Word中文版!');
DdeExample.ServiceApplication := 'WinWord.exe';
end;
end
else begin{如果巳动态链接执行宏命令}
DdeExample.ExecuteMacroLines(Cmds,False);
end;
end
else
DdeExample.ExecuteMacroLines(Cmds,false);
end; 在private声明区里加入如下:
procedure ActiveWord(Cmds: TStrings); 3)在Form1中加入一个按钮Button1,在其onclick事件里写如下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
Cmds:TStringList;{创建Cmds}
TempItem1,TempItem2:String;
begin
cmds:=TStringList.Create;
cmds.Clear;
TempItem1:='数据项一';
TempItem2:='数据项二';
with Cmds do
begin
Clear;
Add('[FileNew.Template ="Example.Dot″]');{打开模板文件Example.Dot}
Add('[AppMaximize]');{文档最大化}
Add('[SetFormResult"Item1″,″'+TempItem1+'″]');{将数据TempItem1传给表单域Item1}
Add('[SetFormResult"Item2″,″'+TempItem2+'″]);{将数据TempItem2传给表单域Item2}
end;
WordActive(DdeExample,Cmds);{调用自定义过程}
Cmds.Free;{释放Cmds}
end; 运行这个程序,单击Button1,大家可以发现Word被启动了,屏幕上出现了:数据项一;数据项二两个数据项。最后,大家可以任意修改本报表的格式及数据,因为这时这个报表与具体的应用程序巳没有关系了。 本例中用的是中文Word6或中文Word7。由于Word97的宏命令巳变为Visual Basic语句,如大家想用Word97实现,请将其宏命令改变为相应的代码。 这是个简单的示例,大家可以利用Word的宏录制功能,录取更多的宏(如自动生成表格、填充文字、变动字体等宏命令),并与数据库的各种表联系起来,依次加入Cmds中即可实现您所要求的更复杂的功能。
转
[email protected]
procedure TDataModule_public.WriteExcel(AdsData: TTable; sName, Title: string);
var
ExcelApplication1: TExcelApplication;
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
i, j: integer;
filename: string;
begin
filename := sName;
try
ExcelApplication1 := TExcelApplication.Create(Application);
ExcelWorksheet1 := TExcelWorksheet.Create(Application);
ExcelWorkbook1 := TExcelWorkbook.Create(Application);
ExcelApplication1.Connect;
except
Application.Messagebox('Excel 没有安装!', 'Hello', MB_ICONERROR + mb_Ok);
Abort;
end;
try
ExcelApplication1.Workbooks.Add(EmptyParam, 0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet);
AdsData.First;
for j := 0 to AdsData.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[3, j + 1] := AdsData.Fields[j].DisplayLabel;
ExcelWorksheet1.Cells.item[3, j + 1].font.size := '10';
end;
for i := 4 to AdsData.RecordCount + 3 do
begin
for j := 0 to AdsData.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[i, j + 1] :=
AdsData.Fields[j].Asstring;
ExcelWorksheet1.Cells.item[i, j + 1].font.size := '10';
end;
AdsData.Next;
end;
ExcelWorksheet1.Columns.AutoFit;
ExcelWorksheet1.Cells.item[1, 2] := Title;
ExcelWorksheet1.Cells.Item[1, 2].font.size := '14';
ExcelWorksheet1.SaveAs(filename);
Application.Messagebox(pchar('数据成功导出' + filename), 'Hello',
mb_Ok);
finally
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
ExcelApplication1.Free;
ExcelWorksheet1.Free;
ExcelWorkbook1.Free;
end;
end;