请教:(Delphi & Excel & OLE & 速度)问题!

g961681 2005-07-04 06:29:47
要做一函数实现Delphi把cxGrid导出到Excel,并直接调用打印预缆功能。
功能先已经实现,但有一问题:速度。
每次调用该Excel,都得打开一次Excel,速度奇慢,不知道有什么方法可以加速!

(由于害怕该贴会石沉海底,先放88分。完成效果,再加200)
...全文
299 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
亮剑_ 2005-07-07
  • 打赏
  • 举报
回复
最快的肯定是直接写二进制文件了
Excel文件格式是一种BIFF格式(Binary File Format)

进一步的说明:
http://www.moon-soft.com/program/FORMAT/data/xls.txt
g961681 2005-07-06
  • 打赏
  • 举报
回复
这两天也看过些文章,的确都说如果用OLE方式的话,速度是肯定提不上去的。
而且,这样的方式一定要保证客户机器上一定已经装了excel才行啊!
亮剑_ 2005-07-06
  • 打赏
  • 举报
回复
还有用OLE时如果要设置格式的话,速度也会大受影响,所以除非十分必要,要快就不要设格式了
亮剑_ 2005-07-06
  • 打赏
  • 举报
回复
你怎么可以连续回复4次,不是不能超过3次吗

导EXCEL,OLE方式总归不可能有直接写文件快的,下面这个使用了Excel内置的取数据集功能,速度快一些,供您参考:)

procedure RsToExcel(AdoQuery1: TAdoQuery; ExcelFileName: string);
var
ExcelApp, Book, Sheet, Range, xlQuery: OleVariant;
begin
if not ADOQuery1.Active then
ADOQuery1.Open;

ExcelApp := CreateOleObject( 'Excel.Application' ); //创建
try
if ExcelApp.Workbooks.count < 1 then
ExcelApp.WorkBooks.Add;
Book := ExcelApp.Workbooks[1];
if Book.Worksheets.Count < 1 then
Book.Worksheets.Add;
Sheet := Book.Worksheets[1];

xlQuery := Sheet.QueryTables.Add(ADOQuery1.Recordset, Sheet.Range['A3']);
//xlQuery.FieldNames := false;
xlQuery.Refresh;

Sheet.SaveAs(ExcelFileName);
finally
Sheet := Unassigned;
Book := Unassigned;
if not VarIsEmpty(ExcelApp) then
ExcelApp.Quit;
ExcelApp := Unassigned;
if ADOQuery1.Active then ADOQuery1.Close;
end;
end;

paranoia190 2005-07-06
  • 打赏
  • 举报
回复
ExportGrid4ToExcel:这个东西好象本来就很慢!!
上千条就不怎么样了。
g961681 2005-07-06
  • 打赏
  • 举报
回复
没法顶了!!
g961681 2005-07-05
  • 打赏
  • 举报
回复
呵呵,谢谢!
顶~~~~
yangyi800827 2005-07-05
  • 打赏
  • 举报
回复
最近我也在用这个 导出Excel表的。
你用的是自带的servers控件 中的控件吗?
你的问题 太难了 ,我去请高手给你 看看吧。
等有结果了 一定来这里 回复你的。
g961681 2005-07-05
  • 打赏
  • 举报
回复
ding.............
g961681 2005-07-05
  • 打赏
  • 举报
回复
哎,又要石沉海底了吗?????????
g961681 2005-07-05
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~~~
g961681 2005-07-04
  • 打赏
  • 举报
回复
其中的ExportGrid4ToExcel(sTmpFile, AGrid, True, True, False, 'tmp');是cx控件自带的。
调试的时候可以直接用一个现成的excel打开就可以了。
g961681 2005-07-04
  • 打赏
  • 举报
回复
贴出代码,望高手指点。
//打印数据表格
function PrintCxGrid(AGrid: TcxGrid): String;
var
sTmpFile: String;
eclApp, srcWorkBook: Variant;
begin
//生成临时文件的文件名
sTmpFile := ExtractFilePath(Application.ExeName) + 'E' + FormatDateTime('YYMMDDHHMMSS', Date + Time) + '.tmp';

//
try
Screen.Cursor := crHourGlass;

//
try
eclApp := CreateOleObject('Excel.Application');
srcWorkBook := CreateOleobject('Excel.Sheet');
except
Result := 'Microsoft Excel Not Support In Your System!';
Exit;
end;

//生成并打开临时文件
ExportGrid4ToExcel(sTmpFile, AGrid, True, True, False, 'tmp');
srcWorkBook := eclApp.WorkBooks.Open(sTmpFile);

//开始打印
srcWorkBook.ActiveSheet.PageSetup.Orientation := 2;
srcWorkBook.ActiveSheet.PageSetup.CenterHeader := '表头';
srcWorkBook.ActiveSheet.PageSetup.CenterFooter := '表尾';
eclApp.Visible := True;
srcWorkBook.ActiveSheet.PrintPreview;
finally
//退出Excel Application
eclApp.Quit;
eclApp := Unassigned;

//删除临时文件
if FileExists(sTmpFile) then
while FileExists(sTmpFile) do
DeleteFile(PChar(sTmpFile));

//
Screen.Cursor := crDefault;
end;
end;

5,928

社区成员

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

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