在Winform中,运用using Excel = Microsoft.Office.Interop.Excel;引用EXCEL,完了发现进程中多了好多excel的进程,找了一些资料,说把跟EXCEL有关的全部做以下处理,就把以下代码写到了winform 的formClosing事件里,可是还是出现EXCEL的进程 ,在以下代码做了断电,好像不执行,不知道哪里的问题,请大家帮忙~System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ep);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ew);
System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); excel = null;
ep = null;
range = null;
ew = null;
mySheet = null;
worksheets = null;
workbooks = null;
workbook = null;
sheet = null;
GC.Collect();
System.Runtime.InteropServices.Marshal.ReleaseComObject(ep);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ew);
System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); excel = null;
ep = null;
range = null;
ew = null;
mySheet = null;
worksheets = null;
workbooks = null;
workbook = null;
sheet = null;
GC.Collect();
解决方案 »
- C# 如何得到多边形的点的(X,Y)坐标?
- C#创建应用程序出现错误!!
- 查询orcl数据库并导出成word或excel有格式要求
- 求一关于DataTable的算法
- 后台如何清除textbox里面的值
- GridView中添加了一个模板列,在模板列里放了两个服务器控件.如何以编程的方式控制这两个控件显示与否
- 求高手。指教一下怎样模拟QQ那样的截图功能
- access数据库的问题
- 如何使用Devexpress的chartcontrol画多项式曲线图?
- 请问,Socket类中的Send方法和Receive方法怎么用,是不是发送什么字符,就能接收到什么字符?????
- 异常:No error message available, result code: E_FAIL(0x80004005).
- ASP.NET FileUpload控件使用问题
workbook调用close
app调用Quit再不行就强行关进程吧
我试过了,app的Quit方法就可以退出不过,如果修改了内容,会弹出对话框,提示是否保存。可以设置app不显示Alter
workbook.Close(true, _path + "/" + _filename, m_oMissing); // Quit Excel and clean up.
if (worksheet != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
worksheet = null;
if (workbook != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbook = null;
if (workbook != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbook = null;
if (App != null)
{
App.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(App);
int iProcessID = 0;
String sProcessName = "";
System.Diagnostics.Process[] pTemp;
pTemp = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process pTempProcess in pTemp)
{
sProcessName = pTempProcess.ProcessName;
iProcessID = pTempProcess.Id;
//将EXCEL改成你需要检测的程序名,不要加exe
if (sProcessName.CompareTo("EXCEL") == 0)
{
pTempProcess.Kill();
pTempProcess.Close();
// break;
}
}
App = null;
}
1.停止使用某个对象时,应使用 System.Runtime.InteropServices.Marshal.ReleaseComObject。这样可以减少 RCW 的引用计数。
2。要释放对变量的引用,请将变量设置为等于 Nothing 或 Null。
3.使用 Office 应用程序对象的 Quit 方法通知服务器关闭。 关于第二点做点解释,比如如果你通过wookbooks add了个workbook,你得
books= workbooks;
book = workbooks.Add();
这样释放的时候你才可以方面的把books和book都置为null.不然直接book = Excel.Workbooks.Add();这个workbooks是没办法置为null的了。如果通过上面的内存中还有残留,就是所谓的"僵尸程序了",是RCW造孽,不好整了,不过没什么影响
workBook.Close(false, strExcelFileName, Type.Missing);
excel.Quit();
excel = null; GC.Collect();//垃圾回收 Process[] myProcesses;
DateTime startTime;
myProcesses = Process.GetProcessesByName("Excel");
//得不到Excel进程ID,暂时只能判断进程启动时间
foreach (Process myProcess in myProcesses)
{
startTime = myProcess.StartTime; if (startTime < beforeTime && startTime < afterTime)
{
myProcess.Kill();
}
}