我用的是ms sql server2000,请教如何将一个表或过滤出来的数据导出到excel表中?
解决方案 »
- ???如何判断点击的是 RzShellList或ShellListView的空白处???
- 关于delphi调用DLL问题!
- 关于外部程序调用的消息问题
- [考题]如何修改函数中常量参数的值
- 悲哀:中国第二代身份证日本制造 国人民族自豪感何在?
- 网络数据库问题
- ClientDataSet是否只能用于三层?请具体一点说明
- 如何实现按DBgrid或DBgridEH的行号或行数打印?
- 能不能实现一个程序在运行时完成自身复制?
- 在调用C++写的动态库中的函数时,发生了操作系统不可识别的异常: external exception e06177363,要如何处理啊请高手指教啊?!
- D7下quickreport的预览和打印时数据显示不完整,高手救
- 三层结构(DCOM)中,服务器执行UpdateSQL1.ExecSQL(UpdateKind)出问题?
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;
Procedure TurnToExcel(TmpDBGrid:TDBGrid);
var
MyExcel: Variant;
WorkBook: OleVariant;
WorkSheet: OleVariant;
i,j:integer;
xlsfilename :string;
Savedialog1 :TSaveDialog;
begin
if Application.MessageBox('确认导出到Excel?',App_caption,MB_ICONQUESTION+MB_YESNO)=mrno then
Abort;
SaveDialog1 :=TSaveDialog.create(Application);
SaveDialog1.Filter := 'Excel文件(*.xls)|*.XLS';
if savedialog1.Execute then
if savedialog1.FileName <>'' then
begin
xlsfilename :=savedialog1.FileName;
try
MyExcel:=CreateOleObject('Excel.Application');
MyExcel.Application.WorkBooks.Add;
MyExcel.Caption:='将数据导入到EXCEL表中';
MyExcel.Application.Visible:=false;
WorkBook:=MyExcel.Application.workbooks[1];
worksheet:=workbook.worksheets.item[1];
except
Application.MessageBox('EXCEL不存在!',App_caption,MB_ICONERROR+MB_OK);
Savedialog1.Free;
workBook.Saved := True;
WorkBook.close;
MyExcel.Quit;//释放VARIANT变量
MyExcel:=Unassigned;
end;
i:=1;
Frm_system_progress :=TFrm_system_progress.create(Application);
Try
with TmpDBGrid.DataSource.DataSet do
begin
Open;
DisableControls;
with Frm_system_progress.ProgressBar_temp do
begin
min :=0;
max :=TmpDBGrid.Columns.Count*recordcount;
Position :=0;
end;
Frm_system_progress.label_progress.caption :='正在导出到Excel...';
Frm_system_progress.Show;
Frm_system_progress.update;
for j:=0 to TmpDBGrid.Columns.Count-1 do
begin
if TmpDBGrid.Columns[j].Visible=true then
worksheet.cells[1,j+1]:=TmpDBGrid.Columns[j].Title.Caption;
end;
First;
while not Eof do
begin
inc(i);
for j:=0 to TmpDBGrid.Columns.Count-1 do
begin
if TmpDBGrid.Columns[j].Visible=true then
begin
worksheet.cells[i,j+1].NumberFormatLocal :='@';
worksheet.cells[i,j+1]:=TmpDBGrid.Columns[j].Field.AsString ;
Frm_system_progress.ProgressBar_temp.StepIt;
end;
end;
next;
end;
EnableControls;
end;
WorkBook.saveas(XlsFileName);
Frm_system_progress.ProgressBar_temp.position :=TmpDBGrid.Columns.Count*TmpDBGrid.DataSource.DataSet.RecordCount;
Application.MessageBox('导出到Excel成功!',App_caption,MB_ICONINFORMATION+MB_OK);
Frm_system_progress.Free;
MyExcel.Quit;
MyExcel := Unassigned;
Savedialog1.Free;
except
Application.MessageBox('导出到Excel失败!',App_caption,MB_ICONWARNING+MB_OK);
workBook.Saved := True;
WorkBook.close;
MyExcel.Quit;//释放VARIANT变量
MyExcel:=Unassigned;
Frm_system_progress.Free;
Savedialog1.Free;
end;
end;end;
根据高手指点,我最终实现了向excel导出数据(从adoquery中接收数据进行导出):
注意: uses 中一定要加comobj;uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, DB, ADODB, ComCtrls, ToolWin, ExtCtrls, DBCtrls,
StdCtrls, Buttons, Grids, DBGrids,comobj;procedure tmainfrm.writexls(datasour:tadoquery;xlsname,xlstitle,xlsdate:string);
var
xlsapp,xlssheet:variant;
xlsfilename,xlsfiletitle,xlsfiledate:string;
i,j:integer;
begin
xlsfilename:=xlsname;
xlsfiletitle:=xlstitle;
xlsfiledate:=xlsdate;
try
xlsapp:=createoleobject('excel.application');
xlssheet:=createoleobject('excel.sheet');
except
showmessage('本机没有安装Microsoft excel!');
exit;
end;
mainstatb.Panels[0].Text :='正在导出数据到xls文件';
mainstatb.Refresh;
try
xlssheet:=xlsapp.workbooks.add;
xlsapp.cells(1,1):=xlsfiletitle;
xlsapp.cells(2,1):=xlsfiledate;
if not datasour.Active then
begin
datasour.Active :=true;
end;
Datasour.First;
for j := 0 to datasour.Fields.Count - 1 do
begin
xlsapp.Cells.item[3, j + 1] := datasour.Fields[j].DisplayLabel;
xlsapp.Cells.item[3, j + 1].font.size := '10';
end;
for i := 4 to datasour.RecordCount + 3 do
begin
for j := 0 to datasour.Fields.Count - 1 do
begin
xlsapp.Cells.item[i, j + 1] :=datasour.Fields[j].Asstring;
xlsapp.Cells.item[i, j + 1].font.size := '10';
end;
datasour.Next;
end;
xlsapp.Columns.AutoFit;
xlssheet.saveas(xlsname);
xlssheet.close;
xlsapp.quit;
xlsapp:=unassigned;
mainstatb.Panels[0].Text :='已成功导出数据到xls文件!';
mainstatb.Refresh;
showmessage('数据已保存为: '+xlsname);
except
mainstatb.Panels[0].Text :='导出XLS文件失败!';
mainstatb.Refresh;
showmessage('数据转换出错!');
xlssheet.close;
xlsapp.quit;
xlsapp:=unassigned;
end;
end;
MsExcel:Variant;
MsExcelWorkBook:Variant;
MsExcelWorkSheet:Variant;
Template:OleVariant;
excelchar:String;
av:Variant;
cfornum,ctonum,rnum:Integer;
begin
if IfMsExcel then MsExcel.Quit;
Template:=1;
try
MsExcel:=CreateOleObject('Excel.Application');
MsExcelWorkBook:=MsExcel.WorkBooks.Add(Template);
MsExcelWorkSheet:=MsExcelWorkBook.worksheets.item[1];
MsExcelWorkSheet.Columns.Font.Name:='宋体';
MsExcelWorkSheet.Columns.Font.Size:=9;
IfMsExcel:=True;
except
Application.MessageBox('没有安装Excel!','提示信息',0+mb_iconwarning);
Exit;
end;
MsExcel.caption:=Caption;
//MsExcel.Visible:=True;
ctonum:=DBG_employee.Columns.Count;
av:=VarArrayCreate([1,Query_E_employee.RecordCount+2,1,ctonum],varVariant);
Query_E_employee.DisableControls;
//抬头
av[1,1]:=Caption;
//赋值字段名
for cfornum:=1 to ctonum do begin
av[2,cfornum]:=DBG_employee.Columns.Items[cfornum-1].Title.Caption;
end;
//赋值工资数据
with Query_E_employee do begin
First;
rnum:=3;
while not eof do begin
for cfornum:=1 to ctonum do begin
av[rnum,cfornum]:=DBG_employee.Columns.Items[cfornum-1].Field.AsString;
end;
Inc(rnum);
Next;
end;
end;
excelchar:=Char((ctonum-1) div 26 + 64)+char((ctonum-1) mod 26 + 65);
if excelchar[1]=char(64) then delete(excelchar,1,1);
//赋值标题
//MsExcelWorkSheet.PageSetup.PaperSize:=xlPaperA3;
MsExcelWorkSheet.Range['A1',excelchar+'1'].VerticalAlignment:=xlVAlignCenter;{居中}
MsExcelWorkSheet.Range['A1',excelchar+'1'].HorizontalAlignment:=xlHAlignCenter;
MsExcelWorkSheet.Range['A1',excelchar+'1'].Font.Bold:=True;
MsExcelWorkSheet.Range['A1',excelchar+'1'].Font.Name:='宋体';
MsExcelWorkSheet.Range['A1',excelchar+'1'].Font.Size:=18;
MsExcelWorkSheet.Range['A1',excelchar+'1'].Merge(False);
//赋值内容
excelchar:=excelchar+Trim(IntToStr(rnum-1));
MsExcelWorkSheet.Range['A1',excelchar].Value:=av;
//划线加边框
MsExcelWorkSheet.Range['A2',excelchar].Borders.LineStyle:=xlContinuous;
MsExcel.Visible:=True;
Query_E_employee.EnableControls;
end;