能将数据库数据输出到一个已存在的Excel表中(100分)

  • 主题发起人 主题发起人 王琦
  • 开始时间 开始时间

王琦

Unregistered / Unconfirmed
GUEST, unregistred user!
我的想法是:我要经常利用已存在的这个Excel表格的格式,这样套用不需每次都划表(下面附一文章,它但是成立一个新Excel表)。


附:《Delphi5.0编写OLE程序操纵Excel》文章:




OLE自动化是Windows应用程序之间互相操纵的一种技巧。被操纵的一方称为自动
化服务器(也称自动化对象),典型的自动化服务器有Microsoft Word、Excel和
Powerpoint。操纵自动化服务器的一方称为自动化控制器。在开发数据库应有程序
中,经常需要借助Microsoft Excel的强大报表功能,把数据库中的数据输出到Excel
表格中。Delphi 5.0以前的版本虽然也可以编写自动化控制器和自动化服务器,但编
写程序较为复杂,不易掌握。Delphi 5.0对于OLE提供了强大的支持,利用Delphi 5.0
最新提供的Servers栏控件可以很容易开发OLE自动化控制器实现对OLE自动化服务器的
调用,发挥Word、Excel、Powerpoint的强大功能。

---- 下面给出一利用Delphi 5.0开发OLE自动化控制器操纵Excel的实例,希望对用
Delphi开发OLE应用程序的编程人员有所帮助。

---- 首先新建一Application, 然后在Form1上放置Servers栏控件
ExcelApplication1、 ExcelWorkbook1、 ExcelWorksheet1, 再放置控件Table1、
Datasource1、 Dbgrid1、 Button1、 Button2、 Button3、 Button4, 并设置
Table1.databasename:=dbdemos, Table1.TableName:=Country.db,
Table1.active:=True, Button1.Caption:='SaveToExcel',
Button2.caption:='PrintPreview', Button3.caption:='Print',
Button4.caption:='CloseExcel'。代码如下:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls,
Forms, Dialogs, Excel97, OleServer, Db, DBTables,
Grids, DBGrids, StdCtrls;

type
TForm1 = class(TForm)
ExcelApplication1: TExcelApplication;
ExcelWorkbook1: TExcelWorkbook;
ExcelWorksheet1: TExcelWorksheet;
Table1: TTable;
Table1Name: TStringField;
Table1Capital: TStringField;
Table1Continent: TStringField;
Table1Area: TFloatField;
Table1Population: TFloatField;
button1: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.button1Click(Sender: TObject);
var
i,row,column:integer;
begin
Try
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);
Table1.Open;
row:=1;
While Not(Table1.Eof) do
begin
column:=1;
for i:=1 to Table1.FieldCount do
begin
ExcelWorksheet1.Cells.Item[row,column]:
=Table1.fields[i-1].AsString;
column:=column+1;
end;
Table1.Next;
row:=row+1;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ExcelWorksheet1.PrintPreview;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ExcelWorksheet1.PrintOut;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
end;

end.

---- 本程序在Delphi 5.0下调试通过。
 
将做好格式的表存为模版,以后以这个模版为参数建新表。ok!
 
>>>
 
王琦:
我专门给作了一个Demo,请查收。你给你发的邮件,没写回信地址,害我找半天。
 
w5w:
能给我发一份吗?

我的Email : Kingjohn@21cn.com
 
i agree :w5w
 
yes!
如果你想再加上字段名的话
for i:=1 to table1.FieldCount do
begin
excelworksheet1.Cells.Item[row,i]:=table1.FieldList.Strings[i-1];
end;
 
蒋劲刚:
已给你发了
 
我也想要.
sheepishest@china.com
谢谢!!
 
w5w:
王崎:
麻烦请你们谁能把那个DOME给我发一份好么,不胜感激!!

E-MAIL:powercao@163.net
 
还能给一份给我吗?
w5w? 王崎?
email:liangguowei@yeah.net
 
已放在《练功场》了,欢迎下载
 
打开 Excel 表:
ExcelApp.WorkBooks.Open('C:/my documents/book1.xls');
MyworkBook:=ExcelApp.workBooks[1];

填写:
table1.first;
i := 1;
while not eof do begin
MyWorkBook.WorkSheets[1].Cells[i,2].Value := table1.fieldbyname('name').AsString;
table1.next;
Inc(i)
end;
 
把你的表格写成一个宏,再把数据输出到excel,用delphi控制运行这个宏。
此外输出数据最好使用rang。value=varResultSet;
rang 定义好要输出的范围。

Question:

A handy Delphi procedure to pass datasets in a parameter for DCOM transmission.

Answer:


procedure CreateVarArrayFromDataset(var varResultSet: OleVariant;
ADataset : TDataset);
var
m : Integer;
nRecords, nColumns, nCurRec : Integer;
begin
nRecords := -1;
nColumns := -1;

try
{ Create the array... }
{ Set size to 0..m-1 where m equals the number of columns. }
nColumns := Max(0, ADataset.FieldCount-1);

{Each item is an array of size (0..n) where n equals the number of records.
Entry 0 is where we store the column name. }

nRecords := Max(0, ADataset.RecordCount);

varResultSet := VarArrayCreate([0, nColumns, 0, nRecords], varVariant);

for m := 0 to nColumns do
varResultSet[m, 0] := ADataset.Fields[m].DisplayLabel;

{ Populate from result set. }
ADataset.First;
nCurRec := 1; { Current record number. }
while not ADataset.Eof do begin
{ Put in field values. }
for m := 0 to nColumns do
varResultSet[m, nCurRec] := ADataset.Fields[m].Value;

ADataset.Next;
Inc(nCurRec);
end;
except
on E: Exception do
raise Exception.Create('CreateVarArrayFromDataset() - ' +
IntToStr(nRecords) +
' rec,'+IntToStr(nColumns)+'cols,'+E.Message);
end;
end;

我修改了texcelworksheet,用上面的方法定义了一个新的方法,实现数据库数据一次传送。
 
写宏命令吧。
 
w5w:
能给我发一份吗?

我的Email : KaiLong@mail.qdcatv.com.cn
 
w5w,你放在练功场的文件字节为0,请mailto:harbinlss@21cn.com
选择多行如何做?ExcelWorksheet1.Rows[2,6].Select;怎样写?
 
后退
顶部