求B/S结构下杀掉EXCEL进程的办法!

jtdo 2004-10-24 08:34:27
网上的帖子看了一个够,近10页的结果页页翻,有谱的例子试了一遍又一遍,结果还是没有变!
//------------------------------------------------------------------
看到孟子老大的帖子,我试试了如下的方法:
private void KillProcess(string processName)
{
System.Diagnostics.Process myproc= new System.Diagnostics.Process();
//得到所有打开的进程
try
{
foreach (Process thisproc in Process.GetProcessesByName(processName))
{
if(!thisproc.CloseMainWindow())
{
thisproc.Kill();
}
}
}
catch(Exception Exc)
{
Response.Write( "杀死" + processName + "失败!");
}
}
结果是执行 Process.GetProcessesByName(processName) 的时候就出错了,跟踪结果是不允许访问进程--win32异常。

//----------------------------------------------------
看到羊羊的解决方法,如下:
if (myExcel != null)
{
if (myBook != null)
{
if (curSheet != null)
{
if (ran != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ran);
ran = null;
}

System.Runtime.InteropServices.Marshal.ReleaseComObject(curSheet);
curSheet = null;
}
myBook.Close(false,missing,missing);

System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
myBook = null;
}
myExcel.Application.Workbooks.Close();
myExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
myExcel = null;
GC.Collect();
}
结果是:excel进程依然快乐的活着。

//----------------------------------------
还看到了这样一个方法,作者忘了:
/// <summary>
/// 释放EXECL对象。
/// 处理没关掉的excel 进程,导致不能打开EXCLE文件
/// </summary>
/// <param name="myExcel">APPLICATION对象</param>
/// <param name="myWB">Excel._Workbook对象</param>
/// <param name="myWS">Excel._Worksheet对象</param>
/// <param name="myRrange">Excel.Sheets对象</param>
private void closeExcelProcess(Microsoft.Office.Interop.Excel.Application myExcel,Microsoft.Office.Interop.Excel.Workbooks myWB,Microsoft.Office.Interop.Excel._Worksheet myWS,Microsoft.Office.Interop.Excel.Sheets mySheets)
{
// myWB.Close(false, Type.Missing, Type.Missing);
myWB.Close();
myExcel.Workbooks.Close();
myExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
System.Runtime.InteropServices.Marshal.ReleaseComObject(myWS);
System.Runtime.InteropServices.Marshal.ReleaseComObject(myWB);
mySheets=null;
myWS = null;
myWB = null;
myExcel = null;
GC.Collect();


// Excel.Application objApp = new Excel.Application();
// Excel.Workbooks workbooks=objApp.Workbooks;
// Excel.Sheets objSheets = objApp.Worksheets;
// Excel._Worksheet objSheet;
}
结果是:涛声依旧。

=================================

我的环境是:Win2003 ; VS.NET 2003 ; Office 2003 ;

主啊,路过的弟兄们啊,救救我吧。
给孟子老大发了帖子,还没有等到他的回音... ...
...全文
751 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
quanyi 2005-07-28
  • 打赏
  • 举报
回复
mark
redeemleep 2004-12-16
  • 打赏
  • 举报
回复
我也碰到这样的问题了
nctong 2004-12-07
  • 打赏
  • 举报
回复
我现在用的是。NET里的C#,现在我要把一个名字为教工信息.xls里的数据通过设计一个。ASPX的页面导入到SQL SERVER2000里的某个数据库里面。。可是现在我用OLEDBDATAADPTER或者ODBCDATAADPTER都没有办法和这个XLS文件建立连接!!系统老是说我的ODBC什么驱动不能用啊什么的。。。各位高手谁能告诉我怎么会事情啊?
我的系统是windows2000server sp4
.net 2003 version 7.1.3091
framework 1.1 version 1.1.4322
WJY2003 2004-12-07
  • 打赏
  • 举报
回复
没明白你要干吗?
jtdo 2004-12-07
  • 打赏
  • 举报
回复
用Excel对象的时候,比较特别的地方就是即使是一个单元格这样的小东西都要New成一个对象,而不能够直接使用cell[1,2]这样得到其中的结果。之所以都要New成对象就是要每个都要显示的销毁。注意这一点。谢谢大家的支持,分数不多,贵在解决问题。散分!
jtdo 2004-12-07
  • 打赏
  • 举报
回复
弟兄们,这个问题解决了。现在把解决方案放到这里供大家参考。同时大家还可以参考
http://support.microsoft.com/default.aspx?scid=kb;en-us;317109上的说明。关键代码如下:

using Microsoft.Office.Interop.Excel;

private void ResponseExcel()
{
GC.Collect();
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application myExcel=new Microsoft.Office.Interop.Excel.ApplicationClass();
myExcel.Visible = false;
//打开新文件
Microsoft.Office.Interop.Excel.Workbooks myBooks = myExcel.Workbooks;
Microsoft.Office.Interop.Excel.Workbook myBook = myBooks.Open(sourceFile,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing, missing,missing,missing,missing);
Microsoft.Office.Interop.Excel.Worksheet curSheet = (Microsoft.Office.Interop.Excel.Worksheet)myBook.ActiveSheet;

Microsoft.Office.Interop.Excel.Range rans = (Microsoft.Office.Interop.Excel.Range)curSheet.Cells;
Microsoft.Office.Interop.Excel.Range ran = null;
Microsoft.Office.Interop.Excel.Range ranMerge = null;
Microsoft.Office.Interop.Excel.Range ranRows = null;
Microsoft.Office.Interop.Excel.Range ranCells = null;
for( int i=0; i < 10; i++ )
{
for( int j=0; j < 10; j++ )
{
ran = (Microsoft.Office.Interop.Excel.Range)rans[i+1,j+1];

ranMerge = ran.MergeArea;
ranRows = ranMerge.Rows;
int mergeRows = ranRows.Count;
ranCells = ranMerge.Cells;
int mergeCells = ranCells.Count;
Response.Write( "<br>" + i + ":" +j + " : " + ran.Text );

System.Runtime.InteropServices.Marshal.ReleaseComObject (ranCells);
ranCells = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject (ranRows);
ranRows = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject (ranMerge);
ranMerge = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject (ran);
ran = null;
}
}

System.Runtime.InteropServices.Marshal.ReleaseComObject (rans);
rans = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject (curSheet);
curSheet = null;

myBook.Close(false,Type.Missing,Type.Missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject (myBook);
myBook = null;

myBooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject (myBooks);
myBooks = null;

myExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (myExcel);
myExcel = null;

GC.Collect();
GC.WaitForPendingFinalizers();
}


看了这些大家应该能明白了吧?
jerrycool 2004-11-28
  • 打赏
  • 举报
回复
有特殊的地方会用到的.楼上想不到吗?当然一个程序运行时,别的程序不能运行.像Wom2004好晕~~~装的时候自动杀了很多常见的虚拟光驱.
xxuu503 2004-11-27
  • 打赏
  • 举报
回复
UP,不过为什么要杀进程呢?
cgsun 2004-11-27
  • 打赏
  • 举报
回复
foreach (Process thisproc in Process.GetProcessesByName(processName))
{
if(!thisproc.CloseMainWindow())
{
thisproc.Kill();
}
}

我先打開一個excel文檔,然後運行程式,結果那個原來的那個excel也被關點了.
why?啊是不是哪裡錯了
TonyTonyQ 2004-11-26
  • 打赏
  • 举报
回复
你說的第一种方法在 Windows 應用程序中可行,也是最保險的方法;你說的第二种方法我也用過,在WinXP中有效,在Win2K server上有時有效,有時無效(奇怪)。
jjstar 2004-11-08
  • 打赏
  • 举报
回复
http://www.cnblogs.com/jjstar/archive/2004/11/08/61316.html
jtdo 2004-10-25
  • 打赏
  • 举报
回复
高手们,近来帮帮忙啊!
jtdo 2004-10-25
  • 打赏
  • 举报
回复
To sfchina(呛水鱼) :
这倒不会,杀进程的时候有这样的一个判断 if(!thisproc.CloseMainWindow()) ,这样就不会把用户打开的Excel文件给中止了,而是只中止New出来的那个Excel进程。
sfchina 2004-10-24
  • 打赏
  • 举报
回复
俺没有做过,不过猜想应该会有权限的问题吧!!
否则,随意可以杀死进程,那岂不是会乱了套??非常地不安全?
jtdo 2004-10-24
  • 打赏
  • 举报
回复
这个问题肯定不是我第一个遇到,也肯定不是最后一个遇到。希望高手们近来看看,大家一起找个解决方案留给后来人。如果分不够,我还可以追加!

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧