我现在在Winform中用到了线程去调用Excel汇出资料;在汇出的过程中,有可能会取消一些线程,我如何才能关闭掉运行中的Excel进程;调用Excel代码如下:
类级:
ExportHelper eHelper;
Thread t;方法级:
string strTemp = string.Empty;
for(int i =0; i < 10; i++){ 
    strTemp = strTemp = objDS.Tables[0].Rows[i][0].ToString();
    eHelper = new ExportHelper(strTemp);  //因为需要传递参数
    t = new Thread(new ThreadStart(eHelper.Export));
    t.Name = strTemp;
    t.Start();
}在Export方法中我调用Excel:
m_objExcel = new excel.ApplicationClass();
然后写数据请问怎样才能够实现我说的那种效果,或者相近的效果
谢谢!

解决方案 »

  1.   

    eHelper里面提供一个释放资源的方法取消或者正常结束线程的时候调用
      

  2.   

    这个进程应该不能关,如果关了整个excel都会退出,那么与你工程有关无关的excel文件都会关闭,你如果只想汇总资料建议你采用后帮定方式来打开excel,需要关闭时只将当前excelApplication.Close()即可,后帮定具体方法上网搜下吧。(只因为采用后帮定是因为这样不用区分office版本。)
      

  3.   

    //先关闭EXCEL
    m_ExcelApplication.Workbooks.Close();
    m_ExcelApplication.Quit();
    //然后让资源回收站来回收资源
    m_ExcelApplication = null;
    m_GridRange = null;
    m_Worksheet  = null;
    m_oMissing = null;
    System.GC.Collect();
      

  4.   

    可能是我没有说清楚,我想实现的效果是:
    我现在用线程调用excel来汇出资料
    在我的ExportHelper 中有释放excel进程的方法
    //釋放資源
            if (null != m_objBook)
            {
                m_objBook.Close(m_objOpt, m_objOpt, m_objOpt);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);
            }        if (null != m_objExcel)
            {
                m_objExcel.Workbooks.Close();
                m_objExcel.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);
            }
                    
            m_objBook = null;
            m_objExcel = null;
            GC.Collect();
    不过这是正常完成的情况,我现在是要在往excel中写资料的时候,也就是现在这个线程是在执行,
    比如:我现在有三个线程执行,那么在任务管理器中就会看见三个excel的进程,
    PID为: 1000,1500,2000
    我现在想结束掉Pid为1000的
    此时程序仍然在向这个Pid为1000的excel所对应的文件中写资料
    我要如何去结束掉它
    我的做法是:
    Thread[] oThreadPool = new Thread[10];
    string strTemp = string.Empty;
    for(int i =0; i < 10; i++){ 
        strTemp = strTemp = objDS.Tables[0].Rows[i][0].ToString();
        eHelper = new ExportHelper(strTemp);  //因为需要传递参数
        t = new Thread(new ThreadStart(eHelper.Export));
        t.Name = strTemp;
        oThreadPool[i] = t;
        t.Start();
    }然后结束的时候是通过一个输入框来的
    string strName = this.txtProcessCount.Text.Trim();
    for (int i = 0; i < oThreadPool.Length; i++)
    {
          if (oThreadPool[i].ThreadState != System.Threading.ThreadState.Stopped
              && oThreadPool[i].Name.Equals(strName))
           {
                oThreadPool[i].Abort();
            }
    } 这样是可以完成功能,但是会报异常,因为调用了com接口.而且还会提示excel文件被修改是否需要保存的对话框,因为我这个是做为一个后台程序运行,所以出现这样的问题,如果不点对话框,程序就不能继续运行.
    请问有没有什么好的方法,或者哪位前辈做过类似的功能的请指点一下,谢谢!
      

  5.   

    至于保存你可以录制下来vba中的写法,仍然建议采用后帮定,或是用vb.net写个dll这两种方法都可以直接写vba代码,实现很多功能效率都很高。退出excel要先关闭当前excel,然后excel对象.exit
      

  6.   

    vb或者vba不会,请说具体点,谢谢!
      

  7.   

    有个最简单的方式学习vba,你选择office里宏的录制功能,选择录制,然后你对office的大多数操作都能录制出代码的。Alt+F11,显示vba代码。