c#操作excel后关闭excel.exe的方法

c#操作excel后关闭excel.exe的方法
1。网上的一种说法,关闭range,关闭worksheet,关闭workbook,最后关闭excel
System.Runtime.InteropServices.Marshal.ReleaseComObject(Range);
2System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
3System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);

Range = null;
myBook = null;
myExcel = null;

我试过,没有成功


2。关闭进程
C#和Asp.net下excel进程一被打开,有时就无法关闭,   尤其是website.对关闭该进程有过GC、release等方法,但这些方法并不是在所有情况下均适用。  于是提出了kill   process的方法,   目前我见过的方法多是用进程创建时间筛选excel.exe进程,   然后kill 。     这样的方法是不精确的,   也是不安全的,   通过对网上一些关于Api运用文章的阅读,   我找到了更为直接精确找到这个process并kill的方法,以下就是代码        
using   System.Runtime.InteropServices;  
     
  [DllImport("User32.dll",   CharSet   =   CharSet.Auto)]  
  public   static   extern   int   GetWindowThreadProcessId(IntPtr   hwnd,   out   int   ID);  
  protected   void   Button1_Click(object   sender,   EventArgs   e)  
  {  
      Excel.ApplicationClass   excel   =   new   Microsoft.Office.Interop.Excel.ApplicationClass();  
      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);  
      IntPtr   t   =   new   IntPtr(excel.Hwnd);  
      int   k   =   0;  
      GetWindowThreadProcessId(t,   out   k);  
      System.Diagnostics.Process   p   =   System.Diagnostics.Process.GetProcessById(k);  
      p.Kill();                  
   }


以上代码百分百成功的关闭excel.exe进程
我的做法是结合两者,先释放资源,然后关闭进程。
同时网上说避免使用GC.Collect 方法 (),因为会导致整个clr进行gc,影响你的性能.所以我也没有调用GC.Collect

---------------------------------------------------------------------------------------

Excel.ApplicationClass Myexcel=new Excel.ApplicationClass();
if(Myexcel==null)
{
MessageBox.Show("EXCEL无法启动!","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
}
Myexcel.Visible=true;
Myexcel.UserControl=true;
Excel.Workbooks Myworkbooks=Myexcel.Workbooks;
Excel.Workbook Myworkbook=Myworkbooks.Open(@"i:\N_订单表.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);
Excel.Worksheet Myworksheet=(Excel.Worksheet)Myworkbook.Worksheets[1];
Excel.Range MyRange=Myworksheet.get_Range("A1","N1");
int Rindex=dataset1.Tables["N_订单表"].Rows.Count;
int Cindex=dataset1.Tables["N_订单表"].Columns.Count;
Object [] MyHead=new Object[Cindex];
for(int i=0;i<Cindex;i++)
{
MyHead[i]=dataset1.Tables["N_订单表"].Columns[i].Caption;
}
MyRange.Value2=MyHead;
Object [,] EValue=new Object[Rindex,Cindex];
MyRange=MyRange.get_Range("A2","N11");
for(int i=0;i<Rindex;i++)
{

for(int j=0;j<Cindex;j++)
{
EValue[i,j]=dataset1.Tables["N_订单表"].Rows[i][j].ToString();
}
}
MyRange.Value2=EValue;
Myworkbook.Save();
Myworkbooks.Close();
Myexcel.Quit();
MessageBox.Show("EXCEL保存成功","完成");

 

 

 

//--------------------------------------------------------------------------------

 public void Export(GridView gv)
    {
        string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
        string filePath = Server.MapPath("..") + fileName;
        System.Web.HttpResponse httpResponse = Page.Response;
        httpResponse.AppendHeader("Content-Disposition", "attachment;filename="
                               + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
        httpResponse.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");

        httpResponse.ContentType = "application/excel";

        System.IO.StringWriter tw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
        gv.RenderControl(hw);
       
        System.IO.StreamWriter sw = System.IO.File.CreateText(filePath);
        sw.Write(tw.ToString());
        sw.Close();

        DownFile(httpResponse, fileName, filePath);
        httpResponse.End();
    }

    private bool DownFile(System.Web.HttpResponse Response, string fileName, string fullPath)
    {
        try
        {
            Response.ContentType = "application/octet-stream";

            Response.AppendHeader("Content-Disposition", "attachment;filename=" +
            HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ";charset=GB2312");
            System.IO.FileStream fs = System.IO.File.OpenRead(fullPath);
            long fLen = fs.Length;
            int size = 102400;//每100K同时下载数据
            byte[] readData = new byte[size];//指定缓冲区的大小
            if (size > fLen) size = Convert.ToInt32(fLen);
            long fPos = 0;
            bool isEnd = false;
            while (!isEnd)
            {
                if ((fPos + size) > fLen)
                {
                    size = Convert.ToInt32(fLen - fPos);
                    readData = new byte[size];
                    isEnd = true;
                }
                fs.Read(readData, 0, size);//读入一个压缩块
                Response.BinaryWrite(readData);
                fPos += size;
            }
            fs.Close();
            System.IO.File.Delete(fullPath);
            return true;
        }
        catch
        {
            return false;
        }
    }

posted @ 2010-08-28 09:35  Wind&#183;e  阅读(1014)  评论(0编辑  收藏  举报