DBGrid 显示的数据 保存为 EXCEL 或Word文件 大家好,用ADOquery ADOconection ,Datasource 连接的SQLSERVER2000 数据库 怎样将DBGrid中显示的数据保存为EXCEL 或WORD文件谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我给你一个我自己写的组件 下载地址:http://www.susuo.com/bbs.official/UpFile/UpAttachment/2006-12/20061221155715.rar,属性:DataSet 是连接数据集来源属性:Sqlstring 是连接Dataset执行的SQL语句属性:Active执行查询属性:pringting 导出打印! 或者你见这个帖子:http://community.csdn.net/Expert/topic/5239/5239149.xml?temp=.8936579 To:winxkm(蹩脚的程序员)非常感谢, 我还没编写过组件,下载了您编写的组件,然后在unit 中 uses PrintSQL_Data,之后 var..MyPrintSQL_Data: TPrintSQL_Data;implementation{$R *.dfm}procedure TForm7.FormCreate(Sender: TObject);beginMyPrintSQL_Data:=TPrintSQL_Data.end;此时 出现了 [Fatal Error]Unit7.pas[7]: File not found:'PrintSQL_Data.dcu'找不到dcu 文件我原来没有引用过自定义的组件,也是新手,不知道怎样将这个printSQL_Data 组件生成 .dcu 文件 ,是不是需要做个位图,将组件安装上 才能使用,恳请您的指点 这样的,这个组件可能使用了第三方控件,你打开这个pas文件,删除如下代码:uses SysUtils, Classes,Messages, Variants, Graphics, Controls, Forms, Dialogs,windows,ADODB,ComObj,Excel2000,RzPrgres(这个引用去掉,这是第三方的进度条控件);procedure PrintSqlDataToExcel; overload;procedure PrintSqlDataToExcel(PB:TRzProgressBar); overload;这两个方法一个是带进度条的。把下面第2个带进度条参数的方法删除,或者改进一下。上面是没有进度条显示的!加载这个组件,你可以通过delphi的component->install component:在unit file name 编辑框中通过右边的“Browse”选择PrintSQL_Data.pas文件。然后点击“OK”弹出一个界面。然后点击“compile”就可以了 在你的控件面板上会出现一个新的控件页 在最后一个,你就能找到这个组件对于带进度条的导出数据方法,我这里帮你改进一下!第一步,在users里面加上引用单元comctrls,第二步, 将在public里的方法procedure PrintSqlDataToExcel(PB:TRzProgressBar); overload;改为:procedure PrintSqlDataToExcel(PB:TProgressBar); overload;代码改为:procedure TPrintSQL_Data.PrintSqlDataToExcel(PB: TProgressBar);var I:integer; Range,ExcelApp,V:variant;begin Try ExcelApp:=CreateOleObject('Excel.application'); PB.PartsComplete:=0; Except MessageDlg('没有安装Office 办公软件Excel!',mtinformation,[MBOK],0); exit; End; try ExcelApp.WorkBooks.add(Null); V:=ExcelApp.WorkBooks[1].WorkSheets[1]; //*开始设计标题*/ Range:=V.Range['A1',GetExcelCoulmnCaption(DataSet.Fields.Count)+'1']; Range.MergeCells:=true; Range.RowHeight:=24; Range.HoriZontalAlignMent:=xlCenter; Range.VerticalAlignMent:=xlCenter; Range.Font.Name:='新宋体'; Range.Font.size:=16; Range.Font.FontStyle:='加粗'; Range.Value:=FExcelTitle; Range.Borders.LineStyle:=xlContinuous; //边框 Range.Borders.Weight:=xlThin; Range.Borders.ColorIndex:=xlAutomatic; //显示标题 For i:=0 To DataSet.Fields.Count-1 Do begin Range:=V.Range[GetExcelCoulmnCaption(I+1)+'2',GetExcelCoulmnCaption(I+1)+'2']; Range.RowHeight:=24; Range.HoriZontalAlignMent:=xlCenter; Range.VerticalAlignMent:=xlCenter; Range.Font.Name:='新宋体'; Range.Font.size:=9; Range.Font.FontStyle:='加粗'; Range.Columns.AutoFit; Range.Value:=DataSet.Fields[I].FieldName; Range.Borders.LineStyle:=xlContinuous; //边框 Range.Borders.Weight:=xlThin; Range.Borders.ColorIndex:=xlAutomatic; end; //显示内容 //set Range:=V.Range['A3',GetExcelCoulmnCaption(DataSet.FieldCount)+IntToStr(DataSet.recordcount+2)]; Range.NumberFormatLocal:= '@'; Range.RowHeight:=20; Range.HoriZontalAlignMent:=xlCenter; Range.VerticalAlignMent:=xlCenter; Range.Borders.LineStyle:=xlContinuous; //边框 Range.Borders.Weight:=xlThin; Range.Borders.ColorIndex:=xlAutomatic; Range.Font.Name:='新宋体'; Range.Font.size:=9; Range.Columns.AutoFit; PB.Max:=DataSet.RecordCount; PB.Step:=1; PB.Position:=0; DataSet.First; While (Not DataSet.Eof) do begin For i:=0 To DataSet.Fields.Count-1 Do begin Range:=V.Range[GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2),GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2)]; if DataSet.Fields[I].IsNull then Range.Value:=' ' else Range.Value:=DataSet.Fields[I].AsString; Range.Borders.LineStyle:=xlContinuous; //边框 Range.Borders.Weight:=xlThin; Range.Borders.ColorIndex:=xlAutomatic; end; PB.StepIt; DataSet.next; end; //显示Excel文档界面 ExcelApp.visible:=true; V.Activate; finally //释放接口对象 ExcelApp:=unassigned; V:= unassigned; Range:=unassigned; PB.Position:=0; end;end; 太感谢过程 procedure TPrintSQL_Data.PrintSqlDataToExcel(PB: TProgressBar);不是不只该改了参数:TRzProgressBar->TProgressBar,逐个看了每条语句发现过程体没有改动,还有一个问题就是我用的是ADOquery来连接的数据库,对用这个组件德使用没有影响吧?看到数据集是dataset 你要注意看,PB的使用有了改变!主要看PB这个进度条的代码,其它的没变! 这方面的帖子有不少.基本思想就是从DBGrid中读一个单元格的值然后马上写到excel的一个单元格中去,就这样继续 TO: winkxm ,好几天没有到CSDN上来,非常感谢winkxm,:),现在都成朋友了,很耐心的帮我解决了问题,一步一步地 教会了我如何使用自定义的组件, 用 PrintSQL_data 组件终于实现了将DBgrid中的数据 保存到EXCEl中去。 呵呵,是啊winkxm人相当的不错,也帮我解决过问题还有,我有导出为xls的函数,你要不?要就加我的qq5895482我也是新人,一起探讨呵呵。。 调用这个函数,我在OFFICE2007下也试过,没问题:procedure CopyDbDataToExcel(Args: array of const);var iCount, jCount: Integer; XLApp: Variant; Sheet: Variant; i: Integer;begin Screen.Cursor := crHourGlass; if not VarIsEmpty(XLApp) then begin XLApp.DisplayAlerts := False; XLApp.Quit; VarClear(XLApp); end; try XLApp := CreateOleObject('Excel.Application'); except Screen.Cursor := crDefault; Exit; end; XLApp.WorkBooks.Add; XLApp.SheetsInNewWorkbook := High(Args) + 1; for i := Low(Args) to High(Args) do begin XLApp.WorkBooks[1].WorkSheets[i + 1].Name := TDBGrid(Args[i].VObject).Name; Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[i].VObject).Name]; if not TDBGrid(Args[i].VObject).DataSource.DataSet.Active then begin Screen.Cursor := crDefault; Exit; end; TDBGrid(Args[i].VObject).DataSource.DataSet.first; for iCount := 0 to TDBGrid(Args[i].VObject).Columns.Count - 1 do Sheet.Cells[1, iCount + 1] := TDBGrid(Args[i].VObject).Columns.Items[iCount].Title.Caption; jCount := 1; while not TDBGrid(Args[i].VObject).DataSource.DataSet.Eof do begin for iCount := 0 to TDBGrid(Args[i].VObject).Columns.Count - 1 do Sheet.Cells[jCount + 1, iCount + 1] := TDBGrid(Args[i].VObject).Columns.Items[iCount].Field.AsString; Inc(jCount); TDBGrid(Args[i].VObject).DataSource.DataSet.Next; end; XlApp.Visible := True; end; Screen.Cursor := crDefault;end;使用例子:procedure TForm1.Button1Click(Sender: TObject);begin try CopyDbDataToExcel([DBGrid1]); except MessageBox(handle, '导出到Excel失败!', '错误', MB_OK); end;end; To :fankie_240 , 很好兴认识你 ,如果能共享 学习:你的导入为XLS 函数,真是是有幸 好的 我的QQ是32559972 ,共同 学习,进步 共勉To:gyf2000 ,十分感谢啊 。。CSDN上高手多,还都很好。谢谢 DELPHI6中如何定义nvarchar类型 想在一个reportbuilder中分成两页打印 被困北京、网上求援--北京的大虾们进来看下 用dbcombobox显示表中的一列,如何取消重复的值 关于InterBase 如何在dbgrid中,浏览两个表中的内容?? 请问这是一个什么错误? 超级简单问题,难倒众多高手! 用Indy10使用GMail的邮件服务器发送邮件的问题,郁闷了3天了,哪位大侠能帮帮我啊,谢谢了!! 应该如何做 Select中DISTINCT关键字的用法? 求一段代码吧,使用mscomm用猫,取来电显示
属性:DataSet 是连接数据集来源
属性:Sqlstring 是连接Dataset执行的SQL语句
属性:Active执行查询
属性:pringting 导出打印!
非常感谢, 我还没编写过组件,下载了您编写的组件,然后在unit 中 uses PrintSQL_Data,之后
var
..
MyPrintSQL_Data: TPrintSQL_Data;
implementation
{$R *.dfm}procedure TForm7.FormCreate(Sender: TObject);
begin
MyPrintSQL_Data:=TPrintSQL_Data.end;
此时 出现了
[Fatal Error]Unit7.pas[7]: File not found:'PrintSQL_Data.dcu'
找不到dcu 文件
我原来没有引用过自定义的组件,也是新手,不知道怎样将这个printSQL_Data 组件生成 .dcu 文件 ,是不是需要做个位图,将组件安装上 才能使用,恳请您的指点
uses
SysUtils, Classes,Messages, Variants, Graphics, Controls, Forms,
Dialogs,windows,ADODB,ComObj,Excel2000,RzPrgres(这个引用去掉,这是第三方的进度条控件);procedure PrintSqlDataToExcel; overload;
procedure PrintSqlDataToExcel(PB:TRzProgressBar); overload;
这两个方法一个是带进度条的。把下面第2个带进度条参数的方法删除,或者改进一下。上面是没有进度条显示的!加载这个组件,你可以通过delphi的component->install component:
在unit file name 编辑框中通过右边的“Browse”选择PrintSQL_Data.pas文件。然后点击“OK”弹出一个界面。然后点击“compile”就可以了
对于带进度条的导出数据方法,我这里帮你改进一下!
第一步,在users里面加上引用单元comctrls,
第二步, 将在public里的方法
procedure PrintSqlDataToExcel(PB:TRzProgressBar); overload;
改为:procedure PrintSqlDataToExcel(PB:TProgressBar); overload;代码改为:
procedure TPrintSQL_Data.PrintSqlDataToExcel(PB: TProgressBar);
var
I:integer;
Range,ExcelApp,V:variant;
begin
Try
ExcelApp:=CreateOleObject('Excel.application');
PB.PartsComplete:=0;
Except
MessageDlg('没有安装Office 办公软件Excel!',mtinformation,[MBOK],0);
exit;
End; try
ExcelApp.WorkBooks.add(Null);
V:=ExcelApp.WorkBooks[1].WorkSheets[1]; //*开始设计标题*/
Range:=V.Range['A1',GetExcelCoulmnCaption(DataSet.Fields.Count)+'1'];
Range.MergeCells:=true;
Range.RowHeight:=24;
Range.HoriZontalAlignMent:=xlCenter;
Range.VerticalAlignMent:=xlCenter;
Range.Font.Name:='新宋体';
Range.Font.size:=16;
Range.Font.FontStyle:='加粗';
Range.Value:=FExcelTitle;
Range.Borders.LineStyle:=xlContinuous; //边框
Range.Borders.Weight:=xlThin;
Range.Borders.ColorIndex:=xlAutomatic; //显示标题
For i:=0 To DataSet.Fields.Count-1 Do
begin
Range:=V.Range[GetExcelCoulmnCaption(I+1)+'2',GetExcelCoulmnCaption(I+1)+'2'];
Range.RowHeight:=24;
Range.HoriZontalAlignMent:=xlCenter;
Range.VerticalAlignMent:=xlCenter;
Range.Font.Name:='新宋体';
Range.Font.size:=9;
Range.Font.FontStyle:='加粗';
Range.Columns.AutoFit;
Range.Value:=DataSet.Fields[I].FieldName;
Range.Borders.LineStyle:=xlContinuous; //边框
Range.Borders.Weight:=xlThin;
Range.Borders.ColorIndex:=xlAutomatic;
end;
//显示内容
//set
Range:=V.Range['A3',GetExcelCoulmnCaption(DataSet.FieldCount)+IntToStr(DataSet.recordcount+2)];
Range.NumberFormatLocal:= '@';
Range.RowHeight:=20;
Range.HoriZontalAlignMent:=xlCenter;
Range.VerticalAlignMent:=xlCenter;
Range.Borders.LineStyle:=xlContinuous; //边框
Range.Borders.Weight:=xlThin;
Range.Borders.ColorIndex:=xlAutomatic;
Range.Font.Name:='新宋体';
Range.Font.size:=9;
Range.Columns.AutoFit; PB.Max:=DataSet.RecordCount;
PB.Step:=1;
PB.Position:=0;
DataSet.First;
While (Not DataSet.Eof) do
begin
For i:=0 To DataSet.Fields.Count-1 Do
begin
Range:=V.Range[GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2),GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2)];
if DataSet.Fields[I].IsNull then
Range.Value:=' '
else
Range.Value:=DataSet.Fields[I].AsString;
Range.Borders.LineStyle:=xlContinuous; //边框
Range.Borders.Weight:=xlThin;
Range.Borders.ColorIndex:=xlAutomatic;
end;
PB.StepIt;
DataSet.next;
end; //显示Excel文档界面
ExcelApp.visible:=true;
V.Activate;
finally
//释放接口对象
ExcelApp:=unassigned;
V:= unassigned;
Range:=unassigned;
PB.Position:=0;
end;
end;
过程 procedure TPrintSQL_Data.PrintSqlDataToExcel(PB: TProgressBar);
不是不只该改了参数:TRzProgressBar->TProgressBar,逐个看了每条语句发现过程体没有改动,
还有一个问题就是我用的是ADOquery来连接的数据库,对用这个组件德使用没有影响吧?看到数据集是dataset
基本思想就是从DBGrid中读一个单元格的值然后马上写到excel的一个单元格中去,就这样继续
好几天没有到CSDN上来,非常感谢winkxm,:),现在都成朋友了,很耐心的帮我解决了问题,一步一步地 教会了我如何使用自定义的组件, 用 PrintSQL_data 组件终于实现了将DBgrid中的数据 保存到EXCEl中去。
要就加我的qq5895482
我也是新人,一起探讨呵呵。。
procedure CopyDbDataToExcel(Args: array of const);
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
i: Integer;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end; try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end; XLApp.WorkBooks.Add;
XLApp.SheetsInNewWorkbook := High(Args) + 1; for i := Low(Args) to High(Args) do
begin
XLApp.WorkBooks[1].WorkSheets[i + 1].Name := TDBGrid(Args[i].VObject).Name;
Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[i].VObject).Name]; if not TDBGrid(Args[i].VObject).DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end; TDBGrid(Args[i].VObject).DataSource.DataSet.first;
for iCount := 0 to TDBGrid(Args[i].VObject).Columns.Count - 1 do
Sheet.Cells[1, iCount + 1] :=
TDBGrid(Args[i].VObject).Columns.Items[iCount].Title.Caption; jCount := 1;
while not TDBGrid(Args[i].VObject).DataSource.DataSet.Eof do
begin
for iCount := 0 to TDBGrid(Args[i].VObject).Columns.Count - 1 do
Sheet.Cells[jCount + 1, iCount + 1] :=
TDBGrid(Args[i].VObject).Columns.Items[iCount].Field.AsString; Inc(jCount);
TDBGrid(Args[i].VObject).DataSource.DataSet.Next;
end;
XlApp.Visible := True;
end;
Screen.Cursor := crDefault;
end;使用例子:
procedure TForm1.Button1Click(Sender: TObject);
begin
try
CopyDbDataToExcel([DBGrid1]);
except
MessageBox(handle, '导出到Excel失败!', '错误', MB_OK);
end;
end;
CSDN上高手多,还都很好。谢谢