用DELPHI把数据库中的数据导入excel中?

minquan2001 2004-08-29 06:00:33
用DELPHI把数据库中的数据导入excel中
分excel中用表和无表的情况
...全文
402 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
minquan2001 2004-09-24
  • 打赏
  • 举报
回复
procedure DbGridEHTO_Excel(DbGridEH:TDbGridEH);
var ExcelApp: Variant;
i,j,row,column:integer;
begin
if DbGridEH.Columns.Count=0 then exit;
//创建应用程序
if not quizmsg('输出到Excel在数据量大时可能需要较长时间,是否继续?') then exit;
ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.WorkBooks.Add;
ExcelApp.WorkSheets[ 'Sheet1' ].Activate;//设置第1个工作表为活动工作表
ExcelApp.ActiveSheet.Rows[1].Font.Size:=9;
ExcelApp.ActiveSheet.Rows[1].Font.Bold := True;
row:=1;
column:=1;
for j:= 0 to DbGridEH.DataSource.DataSet.FieldCount-1 do
begin
ExcelApp.Cells[row,column].Value:=DbGridEH.DataSource.DataSet.Fields[j].DisplayLabel;
column:=column+1;
end;
row:=2;
while (Not DbGridEH.DataSource.DataSet.Eof) and (Not DbGridEH.DataSource.DataSet.IsEmpty) do
begin
column:=1;
for i:=1 to DbGridEH.DataSource.DataSet.FieldCount do
begin
ExcelApp.Cells[row,column].Value:=DbGridEH.DataSource.DataSet .fields[i-1].AsString;
column:=column+1;
end;
DbGridEH.DataSource.DataSet .Next;
row:=row+1;
end;
try
ExcelApp.WorkBooks.Close;
ExcelApp.Quit;
ExcelApp:= Unassigned;
Application.MessageBox('Excel文件导出成功!','成功',MB_OK);
except
ExcelApp:= Unassigned;
end;
end;
maxtool 2004-09-15
  • 打赏
  • 举报
回复
又没有表都可以自己用
wApp := CreateOleobject('Excel.application');
wApp.visible :=true;
wApp.Workbooks.add;
wExcel := wApp.Worksheets.add;
来添加
zdq801104 2004-09-15
  • 打赏
  • 举报
回复
把数据库的一个个表取出来导到EXCEL表格不就可以了
数据集导出代码:
function TForm1.S_IsFileInUse(FileName : string ) : boolean;
var
HFileRes : HFILE;
begin
Result := false;
if not FileExists(FileName) then
exit;
HFileRes := CreateFile(pchar(FileName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;


procedure TForm1.suiButton13Click(Sender: TObject);
Var
ExcelApp:Variant;
SaveDialog1: TSaveDialog;
i,j,row,column:integer;
begin
with Public_DM.ClientDataSet1 do begin
querycount:=RecordCount;
close;open;
if Public_DM.ClientDataSet1.IsEmpty then
begin
ShowMessage('没有数据需要存盘!');//test
Exit;
end;
SaveDialog1:= TSaveDialog.Create(nil);
SaveDialog1.Filter := 'Excel 文件 (*.xls)|*.xls';
SaveDialog1.Title:='确定另存为excel的文件名';
if savedialog1.Execute Then
begin
while S_IsFileInUse(savedialog1.FileName) do
begin
case Application.MessageBox(PChar('无法存盘,'+string(ExtractFileName(savedialog1.FileName))+'正在使用中'), '请确认', MB_ICONQuestion+MB_ABORTRETRYIGNORE+MB_DEFBUTTON2) of
IDAbort:
begin
SaveDialog1.Free;
Exit;
end;
IDRetry:
begin
continue;
end;
IDIgnore:
begin
if Not savedialog1.Execute then break;
end;
end;
end;
end
else
begin
SaveDialog1.Free;
exit;
end;//if
try
ExcelApp:=CreateOleObject('Excel.Application');//首先创建 Excel 对象,使用ComObj
except
Application.Messagebox('Excel没有安装!','Hello',MB_ICONERROR + mb_Ok);
Abort;
end;//end try
try
ExcelApp.Visible := False;//显示当前窗口
ExcelApp.Caption := '应用程序调用 Microsoft Excel';//更改 Excel 标题栏
ExcelApp.WorkBooks.Add;//添加新工作簿:
ExcelApp.WorkSheets[ 'Sheet1' ].Activate;//设置第1个工作表为活动工作表
ExcelApp.ActiveSheet.Rows[1].Font.Size:=10;
ExcelApp.ActiveSheet.Rows[1].Font.Bold := True;
row:=1;
column:=1;
for j:= 0 to Public_DM.ClientDataSet1.FieldCount-1 do
begin
ExcelApp.Cells[row,column].Value:=Public_DM.ClientDataSet1.Fields[j].DisplayLabel;
column:=column+1;
end;
row:=2;
while (Not Public_DM.ClientDataSet1 .Eof) and (Not Public_DM.ClientDataSet1 .IsEmpty) do
begin
column:=1;
for i:=1 to Public_DM.ClientDataSet1 .FieldCount do
begin
ExcelApp.Cells[row,column].Value:=Public_DM.ClientDataSet1 .fields[i-1].AsString;
column:=column+1;
end;
Public_DM.ClientDataSet1 .Next;
row:=row+1;
end;
if Not S_IsFileInUse(savedialog1.FileName) then
try
ExcelApp.ActiveWorkBook.SaveAs(savedialog1.filename);
except
SaveDialog1.Free;
ExcelApp.WorkBooks.Close;
ExcelApp.Quit;
ExcelApp:= Unassigned;
exit;
end;
SaveDialog1.Free;
ExcelApp.WorkBooks.Close;
ExcelApp.Quit;
ExcelApp:= Unassigned;
Application.MessageBox('Excel文件导出成功!','成功',MB_OK);
except
SaveDialog1.Free;
ExcelApp:= Unassigned;
end;
end;
end;
birdhaha 2004-09-14
  • 打赏
  • 举报
回复
还得把ExcelWorkbook1.Disconnect,不然第二次生成的xls会有问题,打不开。
mycys 2004-08-29
  • 打赏
  • 举报
回复
转载别人的,也是在CSDN上找到的,我用了,好用,就是有点慢
procedure TFORMITMI.Button1Click(Sender: TObject);
var
i, row, column: integer;
ExcelApplication1: TExcelApplication;
ExcelWorkbook1: TExcelWorkbook;
ExcelWorksheet1: TExcelWorksheet;

begin
Try
ExcelApplication1 := TExcelApplication.Create(Application);
ExcelWorksheet1 := TExcelWorksheet.Create(Application);
ExcelWorkbook1 := TExcelWorkbook.Create(Application);

ExcelApplication1.Connect;
Except
MessageDlg('Excel may not be installed',
mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0] := True;
ExcelApplication1.Caption := 'Excel Application';
ExcelApplication1.Workbooks.Add(Null, 0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);
DBGrid1.DataSource.DataSet.Open;
row := 2;
ExcelWorksheet1.Cells.Item[1, 1] :='物料编码';
ExcelWorksheet1.Cells.Item[1, 2] :='物料描述';
ExcelWorksheet1.Cells.Item[1, 3] :='单位';
ExcelWorksheet1.Cells.Item[1, 4] :='制构码';
ExcelWorksheet1.Cells.Item[1, 5] :='状态';
While Not (DBGrid1.DataSource.DataSet.Eof) do
begin
column := 1;
for i := 1 to DBGrid1.DataSource.DataSet.FieldCount do
begin
ExcelWorksheet1.Cells.Item[row, column] := DBGrid1.DataSource.DataSet.fields[i - 1].AsString;
column := column + 1;
end;
DBGrid1.DataSource.DataSet.Next;
row := row + 1;
end;

ExcelApplication1.Disconnect;
//ExcelApplication1.Quit;
ExcelApplication1.Free;
ExcelWorksheet1.Free;
ExcelWorkbook1.Free;

end;
IwantFlay 2004-08-29
  • 打赏
  • 举报
回复
更方便一点话,去网上下一个smexport组件, :)不错的
yifei1900 2004-08-29
  • 打赏
  • 举报
回复
使用OLE技术把数据库中数据导入EXCEL,
我有调用EXCEL的例子,
自己用Delphi对数据库返回的数据集作个循环,写进去,
调用例子如下:
unit MainForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComObj, StdCtrls, Excel2000;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ex,wb:Variant;
begin
//更多内容请参考Microsoft VBA帮助(关于Excel的VBA帮助在Office安装目录下
//文件名为VBAXLx.CHM(x为版本号,office2000为9,officexp为10))

//建立Excel对象之前应该包含ComObj和Excel2000单元,因ComObj中定义了Excel服务器,
//Excel2000中定义了很多VBA用的常量。

//请使用try..catch结构捕捉运行期间错误,避免在内存中残留Excel实例。

//建立Excel应用程序对象
try
ex:=CreateOleObject('Excel.Application');
except
MessageBox(Form1.Handle,'您没有安装Excel或Excel出错!!!程序将退出!','警告!',MB_OK);
Exit;
end;
//Open方法打开工作薄(即一个Excel文件),Add方法可以增加一个工作表,(未保存之前)在内存中。
wb:=ex.WorkBooks.Open(ExtractFilePath(Application.ExeName)+'ole.xls');
//可以开始对一个Excel文件进行操作.
ex.Visible:=true; //让Excel应用程序可见,默认是后台操作。
//激活工作表中的一个工作蒲,可以用名称或索引,索引起点为1
wb.WorkSheets[2].Activate;
//激活工作薄后才可以对单元进行操作。
//wb.ActiveSheet.Range['C1'].Value:='C1';
//将值写入单元格或合并区域(指定最左上角的地址)
wb.ActiveSheet.Range['C1:D2'].Merge;
//合并单元格,并保留最左上角的值。对应有UnMerge方法解除合并。
if wb.ActiveSheet.Range['C1'].MergeCells then
begin
ShowMessage('"C1"是合并的单元格');
end;
//判断地址是否在合并区域中。
ShowMessage(wb.ActiveSheet.Range['C1'].Address);
//返回地址的绝对地址,形式:'$C$1'
ShowMessage(wb.ActiveSheet.Range['C1'].MergeArea.Address);
//MergeArea返回一个Range对象,如上,如果C1不是合并单元格,则返回Range['C1'],
//反之,返回合并过的地址,如上显示的是'$C$1:$D$2'(注意返回格式)
ex.ActiveSheet.Range['E1'].Select;
ex.Selection.HorizontalAlignment:=xlHAlignCenter;
//水平对齐方向,有以下值:xlHAlignCenter、xlHAlignDistributed、
//xlHAlignJustify、xlHAlignLeft 或者 xlHAlignRight。另外,
//对于 Range 或 Style 对象,可以将此属性设置为
//xlHAlignCenterAcrossSelection、xlHAlignFill 或 xlHAlignGeneral
//或用数字表示1为无格式,2为居左,3为居中,4为居右:

//同上VerticalAlignment可以设置垂直对齐方式,值可以为
//: xlVAlignBottom、xlVAlignCenter、xlVAlignDistributed、
//xlVAlignJustify 或 xlVAlignTop

wb.ActiveSheet.Rows.RowHeight:=12;
//设置活动工作蒲中所有行的高,
wb.ActiveSheet.Rows[1].RowHeight:=12;
//设置活动工作薄中某一行的高度,以磅为单位,1磅=0.035厘米,若想用厘米,可用
//n*1/0.035,n为厘米数。
ShowMessage(wb.ActiveSheet.Range['C1:D2'].Column);
//返回区域的第一列的索引。
ShowMessage(wb.ActiveSheet.Range['C1:D2'].Row);
//返回区域的第一行索引。
wb.ActiveSheet.Columns[1].ColumnWidth:=20;
//设置列宽,以英文字符为单位,同上可以设置活动工作薄中所有列宽。

//wb.ActiveSheet.Rows[1].Insert;
//在某一行之前插入一行。

//wb.ActiveSheet.Columns[1].Insert;
//在某一列之前插入新列。

//wb.ActiveSheet.Rows[1].Delete;
//删除相应行,同理,可删除相应列。

//wb.ActiveSheet.Range['C1:D2'].Borders[3].Weight:=4; //上
//wb.ActiveSheet.Range['C1:D2'].Borders[4].Weight:=4; //下
//wb.ActiveSheet.Range['C1:D2'].Borders[1].Weight:=4; //左
//wb.ActiveSheet.Range['C1:D2'].Borders[2].Weight:=4; //右
//5-斜( \ ) 6-斜( / )
//设置区域格式,边框粗

wb.ActiveSheet.Columns[1].UseStandardWidth:=true;
//使用标准列宽。

//wb.ActiveSheet.PrintOut;
//打印工作薄.

wb.ActiveSheet.Range['C1:D2'].Copy;
wb.ActiveSheet.Range['E2'].PasteSpecial;
//拷贝区域,从指定地址开始粘贴(粘贴所有内容(包括公式、值和格式))。
//如果公式为相对地址,则粘贴相对地址,若公式为绝对地下,则粘贴为绝对地址。

Wb.ActiveSheet.UsedRange.Copy;
//拷贝活动工作薄中使用过区域。

ShowMessage(IntToStr(wb.ActiveSheet.UsedRange.Rows.Count));
//返回活动工作薄中使用过区域中的行数。
//wb.ActiveSheet.UsedRange.Rows返回活动工作薄中所用区域行对象
//wb.ActiveSheet.UsedRange.Columns返回活动工作薄中所用区域列对象

ex.Caption:='asdfafdsafd';
//Excel应用程序的标题,如上设置后会显示:"asfdasdfa-ole.xls",后一部分为文件名。

//wb.ActiveSheet.Rows[5].PageBreak:=1;
//在某一行之前添加分页符。设置PageBreak:=0可删除分页。

wb.ActiveSheet.Range['C1:D2'].ClearContents;
//删除区域公式。

wb.ActiveSheet.Range['D4'].Formula:='=B4+C4';
//向单元格中写入公式,可用公式请参照VBA帮助。
//绝对引用'=$B$1+$C$4'

wb.ActiveSheet.Rows[1].Font.Name := '隶书';
wb.ActiveSheet.Rows[1].Font.Color := clBlue;
wb.ActiveSheet.Rows[1].Font.Bold := True;
wb.ActiveSheet.Rows[1].Font.UnderLine := True;
//设置字体属性。

wb.ActiveSheet.Rows[10].ShrinkToFit:=true;
//缩写,正好充满整个单元格。

wb.ActiveSheet.Rows[10].WrapText:=true;
//单元格内数据自动换行,如果行宽太小,则会隐藏,看不到。

//报表设置:
wb.ActiveSheet.PageSetup.CenterHeader := '报表演示';
//设置页眉

ex.ActiveSheet.PageSetup.CenterFooter := '第&P页';
//设置页脚。页眉页脚中可以使用的变量参照VBA帮助。

//c.页眉到顶端边距2cm: (内置单位为磅,需换算成厘米。)
ex.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
//d.页脚到底端边距3cm:
ex.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
//e.顶边距2cm:
ex.ActiveSheet.PageSetup.TopMargin := 2/0.035;
//f.底边距2cm:
ex.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
//g.左边距2cm:
ex.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
//h.右边距2cm:
ex.ActiveSheet.PageSetup.RightMargin := 2/0.035;
//i.页面水平居中:
ex.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
//j.页面垂直居中:
ex.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
//k.打印单元格网线:
ex.ActiveSheet.PageSetup.PrintGridLines := True;

wb.ActiveSheet.PrintPreview;
//打印预览。
wb.Save;
//关闭Excel文件,Saveas(fullfilename)方法可以另存这个工作薄。
wb.Saved:=true;
//放弃存盘,即设置已经存盘。
ex.DisplayAlerts:=false;
//在退出或操作Excel时不显示任何提示,如没有保存,
//之类的警告信息。
wb.Close;
wb:=Unassigned; //将Variant变量清空
//退出Excel程序.
ex.Quit;
ex:=Unassigned; //将Variant变量清空
end;

end.
注意:在interface部分uses单元ComObj,
还有,在使用OLE对象时注意使用异常处理,否则出错的话,
会在内存中留下Excel.Appliction,十多M以上,很恐怖。
不明白的联系我:QQ29210922

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧