拜托各位帮忙 DELPHI7 用电子表格保存数据(200分)

  • 主题发起人 主题发起人 daoweiyu025
  • 开始时间 开始时间
D

daoweiyu025

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi7中如何生成如下的EXCEL表格
日报表(2006.)
部门 申报 项目 事项 类型 时间 是否齐全 原因
是 否
具体情况
从数据库中查询出相关数据 用EXCEL表格保存
拜托高人指点迷津
 
用DELPHI7带的EXCEL组件,连接好后,一行一行写入[:D]
 
我给你一段代码,是格式化输出到excel
MyExcel:=CreateOleObject('Excel.Application');
Flag:=true;
with DataM.DataModule1do
begin
if CheckBox2.Checked then
cx.First;
//需要打印全部数据...
repeat//循环打印....
// MyExcel.Visible := true;
//????????????///////////
MyWorkbook:=MyExcel.Workbooks.Add;
MyExcel.ActiveSheet.PageSetup.TopMargin:=1.5/0.035;
MyExcel.ActiveSheet.PageSetup.BottomMargin:=1.5/0.035;
MyExcel.ActiveSheet.PageSetup.LeftMargin:=0.2/0.035;
MyExcel.ActiveSheet.PageSetup.RightMargin:=0.2/0.035;
// MyExcel.ActiveSheet.PageSetup.Orientation := 'xlLandscape';//横向打印。。
MyExcel.Cells[2,6].Value:='单据号:'+Trim(cx.FieldValues['单号'])+'('+Trim(cx.FieldValues['备注'])+')';
MyExcel.Cells[2,9].Value:=' '+FormatDateTime('yyyy',Now)+'年'+FormatDateTime('mm',Now)+'月'+FormatDateTime('dd',Now)+'日 保管工:'+cx.FieldValues['保管工'];
MyExcel.Cells[2,1].Value:='领料单位: '+Trim(cx.FieldValues['领料单位'])+' 收料地点:'+Trim(cx.FieldValues['收料地点']);
//标题...
MyExcel.Cells[1,3].Value:=' 车 间 结 算 料 表';
//标题...
MyExcel.ActiveSheet.Range['a1:p50'].Font.size:=10;
//设置全部字体大小为10
MyExcel.Cells[1,3].Font.size:=16;
//设置标题大小为20
MyExcel.Cells[1,3].Font.bold:=true;
//设置标题为粗体
MyExcel.ActiveSheet.Rows[3].Font.bold:=true;
//设置字体为粗体
MyExcel.ActiveSheet.Rows[3].HorizontalAlignment:=1;
//设置字体对中.
//设置列宽.
MyExcel.ActiveSheet.Columns[1].ColumnWidth:=3;
MyExcel.ActiveSheet.Columns[2].ColumnWidth:=7;
MyExcel.ActiveSheet.Columns[3].ColumnWidth:=18;
MyExcel.ActiveSheet.Columns[4].ColumnWidth:=8;
MyExcel.ActiveSheet.Columns[5].ColumnWidth:=22;
MyExcel.ActiveSheet.Columns[6].ColumnWidth:=4;
MyExcel.ActiveSheet.Columns[7].ColumnWidth:=10;
MyExcel.ActiveSheet.Columns[8].ColumnWidth:=7;
MyExcel.ActiveSheet.Columns[9].ColumnWidth:=7;
MyExcel.ActiveSheet.Columns[10].ColumnWidth:=11;
MyExcel.ActiveSheet.Columns[11].ColumnWidth:=11;
MyExcel.ActiveSheet.Columns[12].ColumnWidth:=12;
rowno:=2;
//从第3行开始
//处理标题...
inc(rowno);
// for j:=0 to 6do
MyExcel.Cells[rowno,j+1].Value:=stringgrid1.Cells[j,0];
MyExcel.Cells[rowno,1].Value:='序号';
MyExcel.Cells[rowno,2].Value:='目录编号';
MyExcel.Cells[rowno,3].Value:='材料名称';
MyExcel.Cells[rowno,4].Value:=' 材 质';
MyExcel.Cells[rowno,5].Value:='规格型号';
MyExcel.Cells[rowno,6].Value:='计量单位';
MyExcel.Cells[rowno,7].Value:='单价';
MyExcel.Cells[rowno,8].Value:='请领数量';
MyExcel.Cells[rowno,9].Value:='实收数量';

MyExcel.Cells[rowno,10].Value:='工作号';
MyExcel.Cells[rowno,11].Value:='总价';
MyExcel.Cells[rowno,12].Value:='备注';
cxView3DblClick(Sender);
//刷新需要打印单据的数据.
with cxview2.DataControllerdo
begin
DataSet.First;
zj:=0;
//double;
repeat
inc(rowno);
MyExcel.Cells[rowno,1].Value:=rowno-3;
MyExcel.Cells[rowno,2].Value:=Trim(DataSet.FieldValues['目录编号']);
if DataSet.fieldbyname('材料名称').IsNull then
MyExcel.Cells[rowno,3].Value:=''
else
MyExcel.Cells[rowno,3].Value:=Trim(DataSet.FieldValues['材料名称']);
if DataSet.fieldbyname('材质').IsNull then
MyExcel.Cells[rowno,4].Value:=''
else
MyExcel.Cells[rowno,4].Value:=Trim(DataSet.FieldValues['材质']);
if DataSet.fieldbyname('规格型号').IsNull then
MyExcel.Cells[rowno,5].Value:=''
else
MyExcel.Cells[rowno,5].Value:=Trim(DataSet.FieldValues['规格型号']);
if DataSet.fieldbyname('计量单位').IsNull then
MyExcel.Cells[rowno,6].Value:=''
else
MyExcel.Cells[rowno,6].Value:=Trim(DataSet.FieldValues['计量单位']);
if DataSet.fieldbyname('单价').IsNull then
MyExcel.Cells[rowno,7].Value:=''
else
MyExcel.Cells[rowno,7].Value:=Trim(DataSet.FieldValues['单价']);
MyExcel.Cells[rowno,8].Value:=FormatFloat('###########0.##',DataSet.FieldValues['实收数量']);
MyExcel.Cells[rowno,10].Value:=Trim(DataSet.FieldValues['母号'])+'-'+Trim(DataSet.FieldValues['子号'])+'-'+Trim(DataSet.FieldValues['细号']);
MyExcel.Cells[rowno,11].Value:=FormatFloat('###,###,###,##0.00',DataSet.FieldValues['单价']*DataSet.FieldValues['实收数量']);
if DataSet.fieldbyname('备注').IsNull then
MyExcel.Cells[rowno,12].Value:=''
else
MyExcel.Cells[rowno,12].Value:=Trim(DataSet.FieldValues['备注']);
zj:=zj+MyExcel.Cells[rowno,11].Value;
DataSet.next;
until DataSet.Eof;
end;
inc(rowno);
MyExcel.Cells[rowno,2].Value:='本页小计';
MyExcel.Cells[rowno,11].Value:=FormatFloat('###,###,###,##0.00',zj);
drawgrid('a3:l'+IntToStr(rowno));
inc(rowno);
MyExcel.Cells[rowno,2].Value:='单位主管: 领料人: 审核: 发料人:';
// MyExcel.ActiveSheet.PrintPreview ;
//else
for i:=1 to StrToInt(Edit1.Text)do
MyExcel.ActiveSheet.PrintOut;
MyExcel.ActiveWorkBook.Saved:=true;
MyWorkbook.close;
if CheckBox2.Checked=false then
//只打印当前的一张票据...
Break;
cx.next;
//需要打印全部票据.
until cx.Eof;
end;
 
问题: 能将数据库数据输出到一个已存在的Excel表中 ( 积分: 100 )
分类: OLE/Automation

来自: 王琦, 时间: 2000-05-28 21:04:50, ID: 255019
我的想法是:我要经常利用已存在的这个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.FieldCountdo

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下调试通过。

来自: Croco, 时间: 2000-05-28 23:20:02, ID: 255081
听~~

来自: w5w, 时间: 2000-05-28 23:39:56, ID: 255095
将做好格式的表存为模版,以后以这个模版为参数建新表。ok!

来自: question, 时间: 2000-05-29 0:22:13, ID: 255122
>>>

来自: w5w, 时间: 2000-05-30 22:38:32, ID: 256339
王琦:
我专门给作了一个Demo,请查收。你给你发的邮件,没写回信地址,害我找半天。

来自: hsw, 时间: 2000-06-06 13:28:16, ID: 261116
>>

来自: 蒋劲刚, 时间: 2000-06-06 23:24:17, ID: 261354
w5w:
能给我发一份吗?
我的Email : Kingjohn@21cn.com

来自: js, 时间: 2000-06-07 1:03:09, ID: 261422
i agree :w5w

来自: 大苹果, 时间: 2000-06-07 10:17:51, ID: 261574
yes!
如果你想再加上字段名的话
for i:=1 to table1.FieldCountdo

begin

excelworksheet1.Cells.Item[row,i]:=table1.FieldList.Strings[i-1];
end;


来自: w5w, 时间: 2000-06-07 23:58:31, ID: 262140
蒋劲刚:
已给你发了

来自: 千中元, 时间: 2000-06-08 0:57:50, ID: 262171
我也想要.
sheepishest@china.com
谢谢!!

来自: powercao, 时间: 2000-06-08 3:07:07, ID: 262242
w5w:
王崎:
麻烦请你们谁能把那个DOME给我发一份好么,不胜感激!!
E-MAIL:powercao@163.net

来自: liangguowei_2, 时间: 2000-06-08 19:52:38, ID: 262816
还能给一份给我吗?
w5w? 王崎?
email:liangguowei@yeah.net

来自: w5w, 时间: 2000-06-08 23:06:50, ID: 262952
已放在《练功场》了,欢迎下载

来自: Crab, 时间: 2000-06-08 23:29:37, ID: 262979
打开 Excel 表:
ExcelApp.WorkBooks.Open('C:/mydo
cuments/book1.xls');
MyworkBook:=ExcelApp.workBooks[1];

填写:
table1.first;
i := 1;
while not eofdo
begin

MyWorkBook.WorkSheets[1].Cells[i,2].Value := table1.fieldbyname('name').AsString;
table1.next;
Inc(i)
end;


来自: gsmgxm, 时间: 2000-07-25 22:12:29, ID: 293945
把你的表格写成一个宏,再把数据输出到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 nColumnsdo

varResultSet[m, 0] := ADataset.Fields[m].DisplayLabel;

{ Populate from result set. }
ADataset.First;
nCurRec := 1;
{ Current record number. }
while not ADataset.Eofdo
begin

{ Put in field values. }
for m := 0 to nColumnsdo

varResultSet[m, nCurRec] := ADataset.Fields[m].Value;

ADataset.Next;
Inc(nCurRec);
end;

except
on E: Exceptiondo

raise Exception.Create('CreateVarArrayFromDataset() - ' +
IntToStr(nRecords) +
' rec,'+IntToStr(nColumns)+'cols,'+E.Message);
end;

end;

我修改了texcelworksheet,用上面的方法定义了一个新的方法,实现数据库数据一次传送。

来自: lyy, 时间: 2000-07-25 23:06:52, ID: 294036
写宏命令吧。

来自: KaiLong, 时间: 2000-08-04 16:30:49, ID: 302961
w5w:
能给我发一份吗?
我的Email : KaiLong@mail.qdcatv.com.cn

来自: samcrm, 时间: 2000-08-16 23:47:26, ID: 310904
我也想要

来自: LSS, 时间: 2000-09-03 15:38:59, ID: 325972
w5w,你放在练功场的文件字节为0,请mailto:harbinlss@21cn.com
选择多行如何做?ExcelWorksheet1.Rows[2,6].Select;怎样写?

来自: 小刚, 时间: 2000-09-04 22:48:43, ID: 327234
LSS:我已经发给你了,收到没有。

来自: ably, 时间: 2000-09-06 22:18:04, ID: 329207
给我一份好吗?

来自: panjf, 时间: 2000-10-05 9:49:24, ID: 357196
也给我发一份好吗?

来自: awind, 时间: 2000-10-20 10:34:37, ID: 370621
w5w:
王崎:
"连工厂“我无法访问。你们可以给我发一份吗?谢谢。
windline@263.net


来自: g622, 时间: 2000-11-11 11:20:37, ID: 391173
多人接受答案了。

得分大富翁: Crab-15,gsmgxm-35,w5w-35,大苹果-15,
 
问题: 如何使用Delphi进行数据库文件的导出、导入 ( 积分: 100 )
分类: 数据库-文件型

来自: 李守强, 时间: 1999-12-09 16:07:35, ID: 166622
如何使用Delphi进行数据库文件的导出、导入
如把文件导入到Excel中

来自: peterwang, 时间: 1999-12-09 16:13:44, ID: 166625
用batchmove吧,有例子的(在delhpi中)

来自: 李长柱, 时间: 1999-12-09 23:46:04, ID: 166836
使用BatchMove,
Delphi可以通过ODBC进行处理EXCEL表。

来自: zhangc, 时间: 1999-12-10 12:19:38, ID: 167016
自己可以做一个和batchmove相同的转换。

来自: 蚯蚓, 时间: 1999-12-10 13:41:56, ID: 167061
<B>龌龊办法:</B>
把数据导出到.dbf库中,然后用Excel打开

来自: thtfsyh, 时间: 1999-12-10 13:53:44, ID: 167063
1、用delphi带的Data Migration Wizard可以轻松完成你的要求
2、用OLE技术(OLEContainer)可以完成第二个要求

来自: www, 时间: 1999-12-10 14:43:29, ID: 167104
table.batmove或TBatmove都行。

来自: sea713, 时间: 2000-04-25 22:43:59, ID: 231309
用OLE技术(OLEContainer)

来自: y_zl, 时间: 2000-04-26 17:27:16, ID: 232025
1.如果是本地小型库,使用BatchMove.
2.如果是大型库,如SQL SERVER,通过标准STOREPROCEDURE取得
表信息,并编程导入,导出(提示,利用SQL可以方便的建立表,本人作过
两个服务器上的SQL 库相互导入,导出,效果还可以.)

来自: autumn, 时间: 2000-04-26 17:38:26, ID: 232034
导出到excel:
var
i,row:integer;
begin

if SaveDialog1.Execute then

begin

Screen.Cursor:=crHourGlass;
ExcelApplication1.Connect;
ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Sheets[1] as _WorkSheet);
if not Query.Active then

begin

Query.SQL:=SQL.Lines;
Query.Open;
end;

pgbar.Visible:=true;
pgbar.Max:=query.RecordCount*query.fields.count;
pgbar.Position:=0;
for i:=0 to Query.Fields.Count-1do

ExcelWOrkSheet1.Cells.Item[1,i+1]:=Query.Fields.FieldName;
row:=2;
while not Query.Eofdo

begin

for i:=0 to Query.Fields.Count-1do

begin

ExcelWOrkSheet1.Cells.Item[row,i+1]:=Query.Fields.AsString;
pgbar.StepIt;
end;

row:=row+1;
Query.Next;
end;

ExcelWorkBook1.SaveCopyAs(SaveDialog1.FileName);
ExcelWOrkBook1.Close(false);
pgbar.Visible:=false;
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
Screen.Cursor:=crDefault;
Application.MessageBox('Export successfully!','Information',0);
end;

end;


来自: adminis, 时间: 2000-04-26 23:54:54, ID: 232311
我的方法是在ODBC中建立一个Excel的数据源。
这样在程序里面可以把这个Excel当作一个文件型数据库处理。
相当与在两个数据库之间导数据。
这样就简单了吧。

来自: liuchuanbo, 时间: 2000-04-27 10:50:20, ID: 232500
把数据库的内容转换到EXCEL:
procedure TForm3.BitBtn2Click(Sender: TObject);
var f:textfile;
fs,str:string;
i,j,k:integer;
begin

if not query1.IsEmpty then

begin

if savedialog1.execute then

begin

fs:=savedialog1.filename;
assignfile(f,fs);
rewrite(f);
for i:=0 to query1.FieldCount-1do

begin

begin

str:=query1.Fields.Displaylabel;
for j:=query1.Fields.datasize to 35do

begin

str:=str+' ';
end;

write(f,str);
end;

end;

writeln(f,'');
query1.first;
for i:=0 to query1.RecordCount-1 do

begin

for j:=0 to query1.FieldCount-1do

begin

str:=query1.Fields[j].Displaytext;
for k:=query1.Fields[j].datasize to 35do

begin

str:=str+' ';
end;

write(f,str);
end;

writeln(f,'');
query1.next;
end;

filestr1:=fs;
closefile(f);
end;

end
else

begin

showmessage('empty table');
end;

query1.first;
end;

保存成excel类型的文件

来自: liuchuanbo, 时间: 2000-04-27 10:52:05, ID: 232503
强强出击,哈哈

来自: cuibin, 时间: 2000-05-03 20:28:16, ID: 237292
使用BATCH MOVE一般都可以实现,同时使用两个DATASOURCE和TABLE即可.

来自: wjiachun, 时间: 2000-09-14 13:51:21, ID: 336036
多人接受答案了。

得分大富翁: adminis-10,autumn-10,cuibin-10,peterwang-10,sea713-10,thtfsyh-10,www-10,y_zl-10,zhangc-10,蚯蚓-10,
 
数据源直接连接到电子表格
 
多人接受答案了。
 
后退
顶部