因为通过数据库的形式读取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程序都会导致程序线程停止(并非挂起),实在是令人气急!   这里也想过不用线程的方式,但是很多记录的时候,读取,界面就跟死了一样,用户那里肯定通不过。各位有何高见,有能够解决这个问题定高分相谢!

解决方案 »

  1.   

    excel application级的不好控制
      

  2.   

    有时候,我都真想直接去商场门口发传单,举牌子了
    请一定帮忙,谢谢!
    请看看:
    http://community.csdn.net/Expert/topic/3663/3663763.xml?temp=.569195
      

  3.   

    you write a tcommponent pack the tthread. define a public method for terminated thread.
    in the method termined the you want termined excel progress use win 32 api terminiteprocess or uses sendmessage(excelmainhwnd,wm_syscommand,sc_close,0);
      

  4.   

    这样还是有问题的,即便能够终止线程,但是如果在线程执行过程中操作Excel的问题依然存在
      

  5.   

    这样还是有问题的,即便能够终止线程,但是如果在线程执行过程中操作Excel的问题依然存在
    问题 is 程序就死锁 ?
      

  6.   

    我以前做過類似的, 也花了不少時間解決類似你的問題, 提几個建議:>>问题在于在线程正在执行的过程中,用户要取消,就会出现问题。采用
    >>  trd1.Suspend;
    >>  trd1.Terminate;不要挂起線程, 而是在操作中, 加一個判斷if Terminated then, 判斷是否用戶要中止, 然後自己操作退出, 但這樣, 會在處理代碼中加入很多判斷的語句, 一般在進入操作時間比較長的時候判斷, 如你用一個 for 循環, 就可以不斷的判斷
    這樣做的目的, 就是在退出時, 不要挂起 excel的線程>>如果线程正在运行的过程中,操作Excel程序都会导致程序线程停止
    一般不要選擇 connect, 而是新建一個 excel的服務器(大概這樣表達吧)
      

  7.   

    >>Create(application);
    如果在在線程中, 我覺得用 Create(nil); 更好
      

  8.   

    这里本来我也是用nil的,可后来想是不是拥有者为application就结束Excel。多谢aiirii(ari-爱的眼睛),我先试试,看能不能行
      

  9.   

    To: aiirii(ari-爱的眼睛)>>如果线程正在运行的过程中,操作Excel程序都会导致程序线程停止
    一般不要選擇 connect, 而是新建一個 excel的服務器(大概這樣表達吧)不知道这里excel服务器怎么建立呢?
      

  10.   

    >>不要挂起線程, 而是在操作中, 加一個判斷if Terminated then, 判斷是否用戶要中止, 然後自己操>>作退出, 但這樣, 會在處理代碼中加入很多判斷的語句, 一般在進入操作時間比較長的時候判斷, 如>>你用一個 for 循環, 就可以不斷的判斷
    >>這樣做的目的, 就是在退出時, 不要挂起 excel的線程这个主意非常不错,第一个问题解决了。可是关于线程执行过程中若操作Excel,线程则非正常挂起,这个还不知道是什么原因??
    aiirii(ari-爱的眼睛)说不connect,可不connect怎么读取excel文件,如何创建excel服务器呢??
    继续求助!