wanderung 2004年12月21日
线程操作Excel时的问题,高分,不够另开贴,问题可能的确不容易,找了很多资料都没有找到。
因为通过数据库的形式读取Excel文件需要定义该文件,而由此不灵活同时达不到要求。所以采取读取文件的方法。

以线程方式读取Excel文件,则出现如下问题:线程终止出现错误!描述如下

ExcelApplication1: TExcelApplication;
ExcelWorkbook1: TExcelWorkbook;
ExcelWorksheet1: TExcelWorksheet;

在线程中创建对象
ExcelApplication1 := TExcelApplication.Create(application);
ExcelWorkbook1 := TExcelWorkbook.Create(application);
ExcelWorksheet1 := TExcelWorksheet.Create(application);
ExcelApplication1.Connect;
ExcelApplication1.Visible[0] := false;
ExcelWorkbook1.ConnectTo(
ExcelApplication1.Workbooks.Open(
'c:\a.xls', EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0));
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as _WorkSheet);

具体读取文件中的内容没问题,以下代码完成读取结束退出Excel。
ExcelApplication1.Quit;
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;
ExcelApplication1.Disconnect;

问题在于在线程正在执行的过程中,用户要取消,就会出现问题。采用
trd1.Suspend;
trd1.Terminate;
结束线程程序运行倒没有出错,然后查看系统进程的时候Excel依然存在,这样打开Excel程序就会有问题(很显然)。而在后面加上trd1.Free;程序就死锁,不知道为什么?

这里尝试过线程对象override
constructor Create(cid: string);
destructor Destroy; override;
其中在Create中创建Excel的对象,在Destroy中关闭、Free对象。程序会出错。

其中有一个错误是:“应用程序调用一个已为另一线程整理的界面”。对这个错误到google搜索,也没有找到什么有用的。

而且问题不仅如此,如果线程正在运行的过程中,操作Excel程序都会导致程序线程停止(并非挂起),实在是令人气急!

这里也想过不用线程的方式,但是很多记录的时候,读取,界面就跟死了一样,用户那里肯定通不过。各位有何高见,有能够解决这个问题定高分相谢!
...全文
203 点赞 收藏 19
写回复
19 条回复

还没有回复,快来抢沙发~

发动态
发帖子
Windows SDK/API
创建于2007-08-02

797

社区成员

2.2w+

社区内容

Delphi Windows SDK/API
社区公告
暂无公告