用ADOQUERY做查询SQL数据库操作,对应如下:
adoquery1 -> dbgrid1
adoquery2 -> dbgrid2
adoquery3 -> dbgrid3
现在想把三个DBGRID里的内容放到同一个EXCEL表中,分别放到同一个EXCEL表的不同SHEET里。
adoquery1 -> dbgrid1 -> excel sheet1
adoquery2 -> dbgrid2 -> excel sheet2
adoquery3 -> dbgrid3 -> excel sheet3
请问要怎么实现?具体的代码是什么?
adoquery1 -> dbgrid1
adoquery2 -> dbgrid2
adoquery3 -> dbgrid3
现在想把三个DBGRID里的内容放到同一个EXCEL表中,分别放到同一个EXCEL表的不同SHEET里。
adoquery1 -> dbgrid1 -> excel sheet1
adoquery2 -> dbgrid2 -> excel sheet2
adoquery3 -> dbgrid3 -> excel sheet3
请问要怎么实现?具体的代码是什么?
你发的两条消息内容不一样?!
但问题是怎么把几个DBGRID里的内容导入到一个EXCEL表里的不同SHEET中。
如:
adoquery1 -> dbgrid1 -> excel sheet1
adoquery2 -> dbgrid2 -> excel sheet2
adoquery3 -> dbgrid3 -> excel sheet3
请在USES中加ComObj,Excel2000!procedure CopyDbDataToExcel(Target: TDbgrid);
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;
//通过ole创建Excel对象
try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end;
XLApp.WorkBooks.Add[XLWBatWorksheet];
XLApp.WorkBooks[1].WorkSheets[1].Name := '测试工作薄';
Sheet := XLApp.Workbooks[1].WorkSheets['测试工作薄'];
if not Target.DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end;
Target.DataSource.DataSet.first;
for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[1, iCount + 1] := Target.Columns.Items[iCount].Title.Caption;
end;
jCount := 1;
while not Target.DataSource.DataSet.Eof do
begin
for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[jCount + 1, iCount + 1] := Target.Columns.Items[iCount].Field.AsString;
end;
Inc(jCount);
Target.DataSource.DataSet.Next;
end;
XlApp.Visible := True;
Screen.Cursor := crDefault;
end;
XLApp.WorkBooks[1].WorkSheets[1].Name := '测试工作薄';
Sheet := XLApp.Workbooks[1].WorkSheets['测试工作薄'];你控制好这几条语句就是了!!
AExcelApp.SheetsInNewWorkbook := 3;
AEWorkSheet1 := AExcelApp.WorkSheets[1];
AEWorkSheet2 := AExcelApp.WorkSheets[2];
AEWorkSheet3 := AExcelApp.WorkSheets[3];
----------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var c,r,i,j : integer ;
app : Olevariant ;
TempFileName,ResultFileName : String ;
begin
if SaveDialog1.Execute then
begin
if adoquery1.IsEmpty then
begin
Application.MessageBox('记录中没有数据','信息',MB_ICONINFORMATION+MB_OK);
Abort;
end; try
app := CreateOLEObject('Excel.application');
except
Application.MessageBox('系统错误!','警告信息',mb_OK or mb_ICONSTOP);
exit;
end; TempFileName := Extractfilename(savedialog1.FileName);
app.Workbooks.add;
app.Visible := false; DBGrid1.DataSource.DataSet.First;
c:=DBGrid1.DataSource.DataSet.FieldCount;
r:=DBGrid1.DataSource.DataSet.RecordCount; for i:=0 to c-1 do
app.cells(1,1+i):= DBGrid1.DataSource.DataSet.Fields[i].DisplayLabel;
for j:=1 to r do
begin
for i:=0 to c-1 do
app.cells(j+1,1+i):= DBGrid1.DataSource.DataSet.Fields[i].AsString; DBGrid1.DataSource.DataSet.Next;
end ; ResultFileName := TempFileName;
if ResultFileName='' then ResultFileName:='自动报表';
//if FileExists(ExtractFilePath(Application.EXEName)+ResultFileName+'.xls') then
//DeleteFile(ExtractFilePath(Application.EXEName)+ResultFileName+'.xls');
//extractfilepath(savedialog1.FileName)
if FileExists(savedialog1.FileName) then
DeleteFile(savedialog1.FileName); //app.Activeworkbook.saveas(ExtractFilePath(Application.EXEName)+ResultFileName+'.xls') ;
app.Activeworkbook.saveas(savedialog1.FileName);
app.Activeworkbook.close(false);
app.quit;
app:=unassigned;
end;
end;
功能描述:把DBGrid输出到Excel表格(支持多Sheet)
设计:CoolSlob
日期:2002-10-23
支持:[email protected]
调用格式:CopyDbDataToExcel([DBGrid1, DBGrid2]);
}
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;
但为什么我调用不成功?
-----------------------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, DBCtrls, DB, DBTables, ActiveX, ComObj,
Excel2000, OleServer;
type
TForm1 = class(TForm)
Table1: TTable;
Table2: TTable;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
DBNavigator2: TDBNavigator;
DBGrid2: TDBGrid;
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
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;beginend;end.
把你的单元代码给我全贴出来,我看一下。
如何在存时让用户输入存的EXCEL表名称?(用savedialog)
CopyDbDataToExcel([DBGrid1, DBGrid2, DBGrid3, DBGrid4, DBGrid5, DBGrid6, DBGrid7]);
问题以解决,使用CoolSlob() 可解决此问题。
问题结贴!