﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-温馨小屋-随笔分类-C#</title><link>http://www.blogjava.net/tank414/category/16871.html</link><description>&lt;MARQUEE direction="up"  height="80" scrollamount="1"onmouseover=stop() onmouseout=start()&gt;可爱的琪琪，开心快乐每一天&lt;/MARQUEE&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:51:30 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:51:30 GMT</pubDate><ttl>60</ttl><item><title>c#操作excel后关闭excel.exe的方法</title><link>http://www.blogjava.net/tank414/archive/2006/11/04/excel.html</link><dc:creator>陈琪</dc:creator><author>陈琪</author><pubDate>Sat, 04 Nov 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/tank414/archive/2006/11/04/excel.html</guid><wfw:comment>http://www.blogjava.net/tank414/comments/79040.html</wfw:comment><comments>http://www.blogjava.net/tank414/archive/2006/11/04/excel.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tank414/comments/commentRss/79040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tank414/services/trackbacks/79040.html</trackback:ping><description><![CDATA[
		<p>1。网上的一种说法，关闭range,关闭worksheet,关闭workbook，最后关闭excel<br />System.Runtime.InteropServices.Marshal.ReleaseComObject(Range); <br />2System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook); <br />3System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel); </p>
		<p>Range ＝ null；<br />myBook = null; <br />myExcel = null;</p>
		<p>我试过，没有成功</p>
		<p>
				<br />2。关闭进程<br />C#和Asp.net下excel进程一被打开,有时就无法关闭,   尤其是website.对关闭该进程有过GC、release等方法，但这些方法并不是在所有情况下均适用。  于是提出了kill   process的方法,   目前我见过的方法多是用进程创建时间筛选excel.exe进程,   然后kill 。     这样的方法是不精确的,   也是不安全的,   通过对网上一些关于Api运用文章的阅读,   我找到了更为直接精确找到这个process并kill的方法，以下就是代码         <br />using   System.Runtime.InteropServices;   <br />      <br />  [DllImport("User32.dll",   CharSet   =   CharSet.Auto)]   <br />  public   static   extern   int   GetWindowThreadProcessId(IntPtr   hwnd,   out   int   ID);   <br />  protected   void   Button1_Click(object   sender,   EventArgs   e)   <br />  {   <br />      Excel.ApplicationClass   excel   =   new   Microsoft.Office.Interop.Excel.ApplicationClass();   <br />      excel.Workbooks.Open("d:\aaa.xls",   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing);   <br />      IntPtr   t   =   new   IntPtr(excel.Hwnd);   <br />      int   k   =   0;   <br />      GetWindowThreadProcessId(t,   out   k);   <br />      System.Diagnostics.Process   p   =   System.Diagnostics.Process.GetProcessById(k);   <br />      p.Kill();                   <br />   }</p>
		<p>
				<br />以上代码百分百成功的关闭excel.exe进程<br />我的做法是结合两者，先释放资源，然后关闭进程。<br />同时网上说避免使用GC.Collect 方法 (),因为会导致整个clr进行gc，影响你的性能.所以我也没有调用GC.Collect</p>
<img src ="http://www.blogjava.net/tank414/aggbug/79040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tank414/" target="_blank">陈琪</a> 2006-11-04 11:28 <a href="http://www.blogjava.net/tank414/archive/2006/11/04/excel.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>