因为通过数据库的形式读取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程序都会导致程序线程停止(并非挂起),实在是令人气急! 这里也想过不用线程的方式,但是很多记录的时候,读取,界面就跟死了一样,用户那里肯定通不过。各位有何高见,有能够解决这个问题定高分相谢!
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程序都会导致程序线程停止(并非挂起),实在是令人气急! 这里也想过不用线程的方式,但是很多记录的时候,读取,界面就跟死了一样,用户那里肯定通不过。各位有何高见,有能够解决这个问题定高分相谢!
解决方案 »
- Midi窗体如何显示在指定的panel当中?
- 请各位帮忙看看我的代码哪里有问题,关于修改密码方面
- 土问一个,怎样调用windows api
- 数据导入导出
- 关于.dcu的问题
- 如何重载加减操作符??
- 单表报表制作问题????????????????????
- odac3.5(oracle data access components version 3.50 net for delphi 6)哪里有下?
- 这个问题有没有解!(得到TRichhEdit中光标(非鼠标)的位置)
- ip3000,dbgridEH,dosmove,cport,wwwTdatetimepicker等控件在哪可以下载?
- 如何编程修改EXE中的资源?
- 如何查找单词??(简单的问题)delphi入门
请一定帮忙,谢谢!
请看看:
http://community.csdn.net/Expert/topic/3663/3663763.xml?temp=.569195
in the method termined the you want termined excel progress use win 32 api terminiteprocess or uses sendmessage(excelmainhwnd,wm_syscommand,sc_close,0);
问题 is 程序就死锁 ?
>> trd1.Suspend;
>> trd1.Terminate;不要挂起線程, 而是在操作中, 加一個判斷if Terminated then, 判斷是否用戶要中止, 然後自己操作退出, 但這樣, 會在處理代碼中加入很多判斷的語句, 一般在進入操作時間比較長的時候判斷, 如你用一個 for 循環, 就可以不斷的判斷
這樣做的目的, 就是在退出時, 不要挂起 excel的線程>>如果线程正在运行的过程中,操作Excel程序都会导致程序线程停止
一般不要選擇 connect, 而是新建一個 excel的服務器(大概這樣表達吧)
如果在在線程中, 我覺得用 Create(nil); 更好
一般不要選擇 connect, 而是新建一個 excel的服務器(大概這樣表達吧)不知道这里excel服务器怎么建立呢?
>>這樣做的目的, 就是在退出時, 不要挂起 excel的線程这个主意非常不错,第一个问题解决了。可是关于线程执行过程中若操作Excel,线程则非正常挂起,这个还不知道是什么原因??
aiirii(ari-爱的眼睛)说不connect,可不connect怎么读取excel文件,如何创建excel服务器呢??
继续求助!