[讨论]导完Excel并退出,怎么关闭Excel进程

问题描述:在一个aspx.cs里创建了一个命名为m_objExcel的Excel Application,完成对打开的Excel文件的数据操作任务后,执行m_objExcel.Quit()关闭Excel文件,但是查看任务管理器里还是存在那个Excel进程,占据着内存,查了一些资料,最终代码如下,依然无法销毁那个Excel进程,各位看看问题出在那里?
{
object m_objOpt = System.Reflection.Missing.Value;
Excel.Application m_objExcel = new Excel.ApplicationClass();
m_objExcel.Visible=true;
Excel.Workbooks m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
Excel._Workbook m_objBook = (Excel._Workbook)(m_objBooks.Open( (Server.MapPath("Printing.xls")),m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt) );
Excel.Sheets m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
Excel._Worksheet m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));

Excel.Range m_objRange = m_objSheet.get_Range("B1", m_objOpt);
m_objRange = m_objSheet.get_Range("B1", m_objOpt).Value = 3;

///colse excel
m_objBook.Save();
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.DisplayAlerts=false;
m_objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objRange);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objSheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);

m_objRange=null;
m_objSheet=null;
m_objSheets=null;
m_objBook=null;
m_objBooks=null;
m_objExcel=null;
GC.Collect();
}
这个问题已经困扰我很久了。。

还有个问题。关于C#操作Excel的
上面这个代码是在web服务器上对服务器上的Excel文件进行了操作并保存。
但我希望它能像ASP一样,在客户端的浏览器中打开这个Excel文件,然后在这个文件上操作。也就是可见的,不是后台进行的。该怎么做呢?
虽然上面的代码中有一行m_objExcel.Visible=true;
但是,无论在服务器还是在客户端都看不到Excel的打开和操作阿。只是在服务器进程中,永久的保留了那个该死而没死掉的进程。



解答1:可以通过进程ID来杀死这个进程。具体该怎么操作:在最后加上这段代码即可
    Process[] processes=System.Diagnostics.Process.GetProcesses();
    for(int i = 0;i    {
     if(processes[i].ProcessName.ToString()=="EXCEL")
     {
      processes[i].Kill();
      //Response.Write(processes[i].ProcessName.ToString()+" had been killed");
     }
     //Response.Write("
"+processes[i].ProcessName.ToString()+"
");
    }

其他的解答方法继续研究中,如果你有好的方法的话,请一定告诉我。谢谢

你可能感兴趣的:(ASP.NET)