200请教一个delphi控制Excel的问题,在线等候!! (200分)

  • 主题发起人 主题发起人 magic_jiang
  • 开始时间 开始时间
M

magic_jiang

Unregistered / Unconfirmed
GUEST, unregistred user!
假设有一个
function formatxm(Const Xtext:String)
begin
.
.
.
end;

请给个例子,如何用delphi把Excel文件中的一个sheet中每一个row,column的值, formatxm()之后写到另一个excel文件中.

请考虑以下因素:

1.效率尽量高;
2.Excel退出要完全;

我的程序如下:

procedure TForm1.Button3Click(Sender: TObject);
Var XlsAppS,XlsAppD: Variant;
iColumn, iRow:integer;
iColCount,iRowCount:Integer;
begin
XlsAppD:=CreateOleObject('Excel.Application');
XlsAppD.WorkBooks.add;
XlsAppS:=CreateOleObject('Excel.Application');
XlsAppS.WorkBooks.Open(OpenDialog1.FileName);
XlsAppS.visible:=False;
XlsAppS.WorkBooks[StrToInt(Edit2.Text)].Activate;
iColCount:=XlsAppS.WorkSheets[StrToInt(Edit2.Text)].UsedRange.Columns.Count;
iRowCount:=XlsAppS.WorkSheets[StrToInt(Edit2.Text)].UsedRange.Rows.Count;
Progressbar1.Min:=0;
ProgressBar1.Max:=iColCount;
ProgressBar1.Position :=ProgressBar1.Min;
ProgressBar1.StepBy(1);
for iColumn:=1 to iColCount do
begin
for iRow:=1 to iRowCount do
begin
XlsAppD.ActiveSheet.Cells.Item[iRow,iColumn].Value:=Formatex(XlsAppS.ActiveSheet.Cells.Item[iRow,iColumn].Value);
end;
ProgressBar1.Position :=ProgressBar1.Position +1;
end;
Progressbar1.Position :=0;
XlsAppD.Save();
XlsAppD.WorkBooks.Close;
XlsAppD.Quit;
XlsAppS.ActiveWorkBook.Saved := True;
XlsAppS.WorkBooks.Close;
XlsAppS.Quit;

end;

这个程序有两个问题,一个是效率低,一个是完成后excel不能退出!

请另外给个例子或者修正我的例子。
 
可以用F1book,比较好写
 
F1Book是什么东西??哪里有下??

如果不用第三方控件呢?
 
难到就没人会吗??
 
还是没人会吗?
 
呵呵,我不会
 
真不明白,为什么不用Delphi自己提供的控件呀!
运行稳定,推出完全,使用方便,还有例子
 
你改一下单元格的属性,用宏记录一下就知道如何处理了。
 
使用delphi自带的控件试试.
 
tooper,hbezwwl,
我用的就是Delphi的早绑定呀!!可是双重循环效率太低!

huiboy,
我知道怎么处理,但是循环的效率太低怎么办?
 
用Delphi自带的组件吧,DFW这方面的帖子很多。
 
先uses Comobj,Excel2000
procedure TForm1.WriteDatasetToExcel(clientdataset1: TClientDataSet; AStrVar: string);
var
EclApp, WorkBook: Variant;
xlsFileName, zdm: string;
I: Integer;
column: Integer;
Row: Integer;
begin
if AStrVar = '宝鸡供电局现场受控工作汇总表' then
begin
xlsfilename := 'c:/temp/宝鸡供电局现场受控工作汇总表';
end;

try
begin
EclApp := CreateOleObject('Excel.Application');
WorkBook := CreateOleObject('Excel.Sheet');
end
except
ShowMessage('您的计算机上没有 Microsoft Excel!');
Exit;
end;
try
FExportDate.ProgressBar1.Min := 0;
workBook := EclApp.workBooks.Add;
row := 2;
EclApp.Workbooks.Item[1].Activate;
eclApp.Cells.font.colorindex := 1;
EclApp.cells.font.size := 10;
EclApp.Activesheet.Cells(1, 1) := AStrVar;
for I := 1 to ClientDataSet1.FieldCount - 1 do
begin
case i of
1:
zdm := '序号';
2:
zdm := '工作单位';
3:
zdm := '工作内容';
4:
zdm := '项目类别';
5:
zdm := '工作类型';
6:
zdm := '班组及工作负责人';
7:
zdm := '单位负责人';
8:
zdm := '部室成员';
9:
zdm := '局级领导';
10:
zdm := '完成时间';

else
zdm := '';
end;
EclApp.Activesheet.Cells(2, I) := zdm;
end;

FExportDate.ProgressBar1.Max := ClientDataSet1.RecordCount;
if not ClientDataSet1.Active then ClientDataSet1.Active := True;
ClientDataSet1.First;
while not (ClientDataSet1.Eof) do
begin
column := 1;
FExportDate.ProgressBar1.Position := row;
for i := 1 to ClientDataSet1.FieldCount do
begin
{如果是日期则跳过 如果是工作地点则跳过}
if (i = 2) or (i = 3) or (i = 4) then
begin
Continue;
end;
if i = 1 then
begin
eclApp.Cells.Item[row + 1, column] := row - 1;
column := column + 1;
end
else
begin
eclApp.Cells.Item[row + 1, column] := ClientDataSet1.fields[i - 1].AsString;
column := column + 1;
end;
end;
ClientDataSet1.Next;
row := row + 1;
end;
WorkBook.saveas(xlsFileName);
WorkBook.close;
WorkBook := eclApp.workBooks.Open(xlsFileName);
filename_Fxq := xlsFileName;
WorkBook.save;
WorkBook.Close;
eclApp.Quit;
eclApp := Unassigned;
except
Application.MessageBox('输出数据出错!!!', '系统信息', MB_OK + MB_ICONQUESTION);
WorkBook.close;
eclApp.Quit; {释放VARIANT变量}
eclApp := Unassigned;
end;
//Application.MessageBox('数据输出完成!!!','系统信息',MB_OK+MB_ICONQUESTION);
end;

其调用过程:
procedure TFExportDate.FormActivate(Sender: TObject);
begin

if FileExists('c:/temp/宝鸡供电局现场受控工作汇总表.xls') then
begin
DeleteFile('c:/temp/宝鸡供电局现场受控工作汇总表.xls');
end;
try
RmDir('c:/temp');
MkDir('c:/temp');
except
MkDir('c:/temp');
end;
BitBtn1.Enabled := false;
Form1.WriteDatasetToExcel(Form1.ClientDataSet1, '宝鸡供电局现场受控工作汇总表');
BitBtn1.Enabled := true;
end;

也运行几个月,很正常
 
用oledb可以将excel打开,然后就可以用Table,Query了,很好用的。
ODBC也可以用,有Microsoft Driver for Excel
 
fpsky,pely,

你们说的都是DB=>Excel,我要的是Excel=>Excel
不过fpsky的程序,解决了我的Excel不能退出的问题,我会给分的!!
 
XlsAppS:= Unassigned; 即可退出,在XlsAppS.quit后面写。

这个我以前作过,现在具体怎么作我忘了,思路是按列来作,这样就可以大大提高速度。
一个单元格一个单元格去读再去写,十分的慢,一千行数据要半个小时以上。按列只要大概
二○秒左右。你再看看。我再找找以前我的东西,我看看
 
bbs_delphi,

你的回答才是我想要的!!请帮忙!!!!

另外,请教以下如何实现PasteSpecial,只粘贴格式,不粘贴数值呢?
 
后退
顶部