在delphi中如何将查询结果导出到excel中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在delphi中如何将查询结果导出到excel中相关的知识,希望对你有一定的参考价值。

在delphi中如何将查询结果导出到excel中

最好有源码啊!
strSql := 'select * from table';
adoquery.close;
adoquery.SQL.Clear;
adoquery.SQL.Add(strSql);
showmessage(strSql);

adoquery.Open;

这样的查询

unit U_func;

interface
uses forms,SysUtils,ComCtrls,DBGrids,DB,Dialogs,Messages,Windows,ComObj,Controls,ADODB,StdCtrls,Graphics;

function ProgressBarform(max:integer):tProgressBar;
function ExportToExcel(dbgrid:tdbgrid):boolean;
function queryExportToExcel(queryexport:tadoquery):boolean;

implementation

//生成一个显示进度条的窗体
function ProgressBarform(max:integer):tProgressBar;
var
ProgressBar1:TProgressBar;
form:tform;
begin
application.CreateForm(tform,form);
form.Position:=poScreenCenter;
form.BorderStyle:=bsnone;
form.Height:=30;
form.Width:=260;
ProgressBar1:=TProgressBar.Create(form);
ProgressBar1.Visible:=true;
ProgressBar1.Smooth:=true;
ProgressBar1.Max:=max;
ProgressBar1.ParentWindow:=form.Handle;
ProgressBar1.Height:=20;
ProgressBar1.Width:=250;
ProgressBar1.Left:=form.Left+5;
ProgressBar1.Top:=form.Top+5;
ProgressBar1.Step:=1;
form.show;
result:=ProgressBar1;
end;

//将DBGRID中的内容导入到EXCEL中
function ExportToExcel(dbgrid:tdbgrid):boolean;
const
xlNormal=-4143;
var
i,j,k:integer;
str,filename:string;
excel:OleVariant;
SavePlace: TBookmark;
savedialog:tsavedialog;
ProgressBar1:TProgressBar;
begin
result:=false;
filename:='';
if dbgrid.DataSource.DataSet.RecordCount>65536 then
begin
if application.messagebox('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?','询问',mb_yesno+mb_iconquestion)=idno then
exit;
end;
screen.Cursor:=crHourGlass;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.Filter:='Excel文件(*.xls)|*.xls';
if savedialog.Execute then
begin
if FileExists(savedialog.FileName) then
try
if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
application.ProcessMessages;
if filename='' then
begin
result:=false;
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
k:=0;
for i:=0 to dbgrid.Columns.count-1 do
begin
if dbgrid.Columns.Items[i].Visible then
begin
//Excel.Columns[k+1].ColumnWidth:=dbgrid.Columns.Items[i].Title.Column.Width;
excel.cells[1,k+1]:=dbgrid.Columns.Items[i].Title.Caption;
inc(k);
end;
end;

dbgrid.DataSource.DataSet.DisableControls;
saveplace:=dbgrid.DataSource.DataSet.GetBookmark;
dbgrid.DataSource.dataset.First;
i:=2;
if dbgrid.DataSource.DataSet.recordcount>65536 then
ProgressBar1:=ProgressBarform(65536)
else
ProgressBar1:=ProgressBarform(dbgrid.DataSource.DataSet.recordcount);
while not dbgrid.DataSource.dataset.Eof do
begin
k:=0;
for j:=0 to dbgrid.Columns.count-1 do
begin
if dbgrid.Columns.Items[j].Visible then
begin
excel.cells[i,k+1].NumberFormat:='@';
if not dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).isnull then
begin
str := dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).value;
Excel.Cells[i, k + 1] := Str;
end;
inc(k);
end
else
continue;
end;
if i=65536 then
break;
inc(i);
ProgressBar1.StepBy(1);
dbgrid.DataSource.dataset.next;
end;
progressbar1.Owner.Free;
application.ProcessMessages;
dbgrid.DataSource.dataset.GotoBookmark(SavePlace);
dbgrid.DataSource.dataset.EnableControls;

try
if copy(FileName,length(FileName)-3,4)<>'.xls' then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName,xlNormal,'', '',False,False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
//Excel.Visible := true;
Excel.Quit;
screen.cursor:=crDefault;
Result:= true;
end;

//将ADOQUERY的数据集导入到EXCEL中
function queryExportToExcel(queryexport:tadoquery):boolean;
const
xlNormal=-4143;
var
i,j,k:integer;
str,filename:string;
excel:OleVariant;
savedialog:tsavedialog;
ProgressBar1:TProgressBar;
begin
result:=false;
filename:='';
if queryexport.RecordCount>65536 then
begin
if application.messagebox('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?','询问',mb_yesno+mb_iconquestion)=idno then
exit;
end;
screen.Cursor:=crHourGlass;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.Filter:='Excel文件(*.xls)|*.xls';
if savedialog.Execute then
begin
if FileExists(savedialog.FileName) then
try
if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
application.ProcessMessages;
if filename='' then
begin
result:=false;
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
k:=0;
for i:=0 to queryexport.FieldCount-1 do
begin
excel.cells[1,k+1]:=queryexport.Fields[i].FieldName;
inc(k);
end;
queryexport.First;
i:=2;
if queryexport.recordcount>65536 then
ProgressBar1:=ProgressBarform(65536)
else
ProgressBar1:=ProgressBarform(queryexport.recordcount);
while not queryexport.Eof do
begin
k:=0;
for j:=0 to queryexport.FieldCount-1 do
begin
excel.cells[i,k+1].NumberFormat:='@';
if not queryexport.fieldbyname(queryexport.Fields[j].FieldName).isnull then
begin
str:=queryexport.fieldbyname(queryexport.Fields[j].FieldName).AsString;
Excel.Cells[i, k + 1] := Str;
end;
inc(k);
end;
if i=65536 then
break;
inc(i);
ProgressBar1.StepBy(1);
queryexport.next;
end;
progressbar1.Owner.Free;
application.ProcessMessages;
try
if copy(FileName,length(FileName)-3,4)<>'.xls' then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName,xlNormal,'', '',False,False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
//Excel.Visible := true;
Excel.Quit;
screen.cursor:=crDefault;
Result := true;
end;

end.
参考技术A procedure ExportExcel(FileName, Caption: string);
var
Eclapp, workbook: variant;
i, n, j: integer;
begin
if FileExists(FileName) then
if (CmmObj.AppMsg('文件已存在,替换吗?') = IDOK) then
DeleteFile(FileName)
else
Exit;
Eclapp:= createoleobject('Excel.Application');
Application.ProcessMessages;
try
Eclapp.workbooks.add;
eclapp.cells[1, 1]:= Caption;
n:= 2;
for i:= 3 to cell.GetRows(0) - 1 do//你记录条数
begin
for j:= 1 to cell.GetCols(0) - 1 do//你每个记录的字段数
begin
eclapp.cells[n, j]:= StringReplace(cell.GetCellString(j, i, 0), ',', '', [rfReplaceAll]);
Application.ProcessMessages;
end;
inc(n);
end;
eclapp.cells[n, 1]:= '总数为:'+ inttostr(cell.GetRows(0) - 1 - 3)+'条';
eclapp.Activeworkbook.saveas(FileName);
eclapp.visible:= true;
except
on E: Exception do
begin
raise Exception.Create(E.Message);
end;
end;
end;
参考技术B 好象有相关的控件,我不太清楚了

不过可以引用COMOBJ单元,在程序里打开一个EXCEL并把查询结果按行依次写到EXCEL的单元格里,然后保存退出。
var ExcelApp: Variant;
ExcelApp := CreateOleObject( 'Excel.Application' );

操作太多参考地址
http://hi.baidu.com/wwjwwj/blog/item/590d65d03c3cba8fa0ec9c0e.html
参考技术C 用2个 ado ,一个 连接到 excel 一个 连到 数据库 然后 一个查询 一个写入 参考技术D unit
U_func;
interface
uses
forms,SysUtils,ComCtrls,DBGrids,DB,Dialogs,Messages,Windows,ComObj,Controls,ADODB,StdCtrls,Graphics;
function
ProgressBarform(max:integer):tProgressBar;
function
ExportToExcel(dbgrid:tdbgrid):boolean;
function
queryExportToExcel(queryexport:tadoquery):boolean;
implementation
//生成一个显示进度条的窗体
function
ProgressBarform(max:integer):tProgressBar;
var
ProgressBar1:TProgressBar;
form:tform;
begin
application.CreateForm(tform,form);
form.Position:=poScreenCenter;
form.BorderStyle:=bsnone;
form.Height:=30;
form.Width:=260;
ProgressBar1:=TProgressBar.Create(form);
ProgressBar1.Visible:=true;
ProgressBar1.Smooth:=true;
ProgressBar1.Max:=max;
ProgressBar1.ParentWindow:=form.Handle;
ProgressBar1.Height:=20;
ProgressBar1.Width:=250;
ProgressBar1.Left:=form.Left+5;
ProgressBar1.Top:=form.Top+5;
ProgressBar1.Step:=1;
form.show;
result:=ProgressBar1;
end;
//将DBGRID中的内容导入到EXCEL中
function
ExportToExcel(dbgrid:tdbgrid):boolean;
const
xlNormal=-4143;
var
i,j,k:integer;
str,filename:string;
excel:OleVariant;
SavePlace:
TBookmark;
savedialog:tsavedialog;
ProgressBar1:TProgressBar;
begin
result:=false;
filename:='';
if
dbgrid.DataSource.DataSet.RecordCount>65536
then
begin
if
application.messagebox('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?','询问',mb_yesno+mb_iconquestion)=idno
then
exit;
end;
screen.Cursor:=crHourGlass;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.Filter:='Excel文件(*.xls)|*.xls';
if
savedialog.Execute
then
begin
if
FileExists(savedialog.FileName)
then
try
if
application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes
then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
application.ProcessMessages;
if
filename=''
then
begin
result:=false;
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
k:=0;
for
i:=0
to
dbgrid.Columns.count-1
do
begin
if
dbgrid.Columns.Items[i].Visible
then
begin
//Excel.Columns[k+1].ColumnWidth:=dbgrid.Columns.Items[i].Title.Column.Width;
excel.cells[1,k+1]:=dbgrid.Columns.Items[i].Title.Caption;
inc(k);
end;
end;
dbgrid.DataSource.DataSet.DisableControls;
saveplace:=dbgrid.DataSource.DataSet.GetBookmark;
dbgrid.DataSource.dataset.First;
i:=2;
if
dbgrid.DataSource.DataSet.recordcount>65536
then
ProgressBar1:=ProgressBarform(65536)
else
ProgressBar1:=ProgressBarform(dbgrid.DataSource.DataSet.recordcount);
while
not
dbgrid.DataSource.dataset.Eof
do
begin
k:=0;
for
j:=0
to
dbgrid.Columns.count-1
do
begin
if
dbgrid.Columns.Items[j].Visible
then
begin
excel.cells[i,k+1].NumberFormat:='@';
if
not
dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).isnull
then
begin
str
:=
dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).value;
Excel.Cells[i,
k
+
1]
:=
Str;
end;
inc(k);
end
else
continue;
end;
if
i=65536
then
break;
inc(i);
ProgressBar1.StepBy(1);
dbgrid.DataSource.dataset.next;
end;
progressbar1.Owner.Free;
application.ProcessMessages;
dbgrid.DataSource.dataset.GotoBookmark(SavePlace);
dbgrid.DataSource.dataset.EnableControls;
try
if
copy(FileName,length(FileName)-3,4)<>'.xls'
then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName,xlNormal,'',
'',False,False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
//Excel.Visible
:=
true;
Excel.Quit;
screen.cursor:=crDefault;
Result:=
true;
end;
//将ADOQUERY的数据集导入到EXCEL中
function
queryExportToExcel(queryexport:tadoquery):boolean;
const
xlNormal=-4143;
var
i,j,k:integer;
str,filename:string;
excel:OleVariant;
savedialog:tsavedialog;
ProgressBar1:TProgressBar;
begin
result:=false;
filename:='';
if
queryexport.RecordCount>65536
then
begin
if
application.messagebox('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?','询问',mb_yesno+mb_iconquestion)=idno
then
exit;
end;
screen.Cursor:=crHourGlass;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.Filter:='Excel文件(*.xls)|*.xls';
if
savedialog.Execute
then
begin
if
FileExists(savedialog.FileName)
then
try
if
application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes
then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
application.ProcessMessages;
if
filename=''
then
begin
result:=false;
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
k:=0;
for
i:=0
to
queryexport.FieldCount-1
do
begin
excel.cells[1,k+1]:=queryexport.Fields[i].FieldName;
inc(k);
end;
queryexport.First;
i:=2;
if
queryexport.recordcount>65536
then
ProgressBar1:=ProgressBarform(65536)
else
ProgressBar1:=ProgressBarform(queryexport.recordcount);
while
not
queryexport.Eof
do
begin
k:=0;
for
j:=0
to
queryexport.FieldCount-1
do
begin
excel.cells[i,k+1].NumberFormat:='@';
if
not
queryexport.fieldbyname(queryexport.Fields[j].FieldName).isnull
then
begin
str:=queryexport.fieldbyname(queryexport.Fields[j].FieldName).AsString;
Excel.Cells[i,
k
+
1]
:=
Str;
end;
inc(k);
end;
if
i=65536
then
break;
inc(i);
ProgressBar1.StepBy(1);
queryexport.next;
end;
progressbar1.Owner.Free;
application.ProcessMessages;
try
if
copy(FileName,length(FileName)-3,4)<>'.xls'
then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName,xlNormal,'',
'',False,False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
//Excel.Visible
:=
true;
Excel.Quit;
screen.cursor:=crDefault;
Result
:=
true;
end;
end.

如何将查询结果导出到Excel文件?

给出以下查询:

     String SQL = "select name,years from person"; 
     ps = con.createStatement();
     rs = ps.executeQuery(SQL);
     jTable1.setModel(DbUtils.resultSetToTableModel(rs));

如何轻松将数据导出到Excel文件?

谢谢

答案
    try Apache POI... http://poi.apache.org/ 

Workbook wb = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Java Books");
  // create header row
  HSSFRow headerRow = sheet.createRow(0)
Cell nameHeaderCell = headerRow.createCell(0);
Cell addressHeaderCell = headerRow.createCell(1);

String sql = "select name, address from student";
PrepareStatement ps =  connection.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();    

int row = 1;
while(resultSet.next()) {
    String name = resultSet.getString("name");
    String address = resultSet.getString("address");

    Row dataRow = sheet.createRow(row);

    Cell dataCell = dataRow.createCell(0);
    dataCell.setCellValue(name);

    Cell dataAddressCell = dataRow.createCell(1);
    dataAddressCell.setCellValue(address);

    row = row + 1;
}

String outputDirPath = "";//PATH for export location
FileOutputStream fileOut = new FileOutputStream(outputDirPath);
wb.write(fileOut);
fileOut.close();

以上是关于在delphi中如何将查询结果导出到excel中的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 如何将查询结果导出到excel中

将 Delphi BDE Paradox *.db 查询结果导出到文本文件?

如何将SQL server 2008 里的查询结果导出到 Excel 表内?

在SQL中如何将查询结果直接导出为EXCEL表格

sqlserver 如何将查询结果导出到excel中

delphi导出excel一部分的列丢失了