C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案
2009年2月3日 [9,330 views] 发表评论 阅读评论
一年前,从网上到一些C#导出MS Excel的例子,但是都不能彻底销毁其所创建的Excel进程,典型的就是进程中的EXCEL.EXE不能关掉。
网上的解决方案大部分是kill掉所有的Excel进程,偶一直感觉不爽。最近,做了几个月的WinForm,接触了一些进程、句柄方面的知识。于是试着解决一下,没想到成功了,创建的Excel进程被成功Kill掉了,而其它Excel进程则相安无事。
关键代码
public void KillSpecialExcel()
        {
            try
            {
世界最大的狗
                if (m_objExcel != null)
                {
                    int lpdwProcessId;
                    GetWindowThreadProcessId(new IntPtr(m_objExcel.Hwnd), out lpdwProcessId);
 
                    System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Delete Excel Process Error:" + ex.Message);
            }
        }
操作生成Excel的全部代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Drawing;
 
namespace VeryCodes.Common.MyExcel
{
    ///
    /// ExcelClass 的摘要说明。
    ///
    public class MSExcel
交通卡余额查询    {
        ///
        /// 构建ExcelClass类
        ///
        public MSExcel()
        {
            //别忘了需要添加Excel Library的引用
            this.m_objExcel = new Microsoft.Office.Interop.Excel.Application();
        }
        ///
        /// 构建ExcelClass类
        ///
        ///
Excel.Application
        public MSExcel(Microsoft.Office.Interop.Excel.Application objExcel)
        {
            this.m_objExcel = objExcel;
        }
 
        ///
        /// 列标号,Excel最大列数是256
        ///
        private string[] ALists = new string[] {
            "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
            "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ",
            "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ",
            "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ",
            "DA", "DB", "DC", "DD", "DE", "DF", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DO", "DP", "DQ", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "DZ",
            "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EJ", "EK", "EL", "EM", "EN", "EO", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ",
            "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FI", "FJ", "FK", "FL", "FM", "FN", "FO", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ",
            "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GI", "GJ", "GK", "GL", "GM", "GN", "GO", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ",
            "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HI", "HJ", "HK", "HL", "HM", "HN", "HO", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ",
            "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "II", "IJ", "IK", "IL", "IM", "IN", "IO", "IP", "IQ", "IR", "IS", "IT", "IU", "IV"
        };
 
        ///
        /// 获取描述区域的字符
        ///
        ///
高考祝福短信
 
        ///
 
        ///
        public string GetAix(int x, int y)
        {
            if (x > 256) { return ""; }
            string s = "";
            s = s + ALists[x - 1].ToString();
            s = s + y.ToString();
            return s;
        }
 
        ///
        /// 给单元格赋值1
        ///
        ///
行号
        ///
列号
        ///
对齐(CENTER、LEFT、RIGHT)
        ///
        public void setValue(int y, int x, string align, string text)
        {
            Microsoft.Office.Interop.Excel.Range range = _Range(this.GetAix(x, y), miss);
限电什么时候结束
            range.set_Value(miss, text);
            if (align.ToUpper() == "CENTER")
牛大仁            {
                range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
            }
            if (align.ToUpper() == "LEFT")
            {
徐若瑄结婚
                range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
            }
            if (align.ToUpper() == "RIGHT")
            {
                range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignRight;
            }
        }
 
        ///
        /// 给单元格赋值2
        ///
        ///
行号
        ///
列号
        ///
        public void setValue(int y, int x, string text)
        {
            Microsoft.Office.Interop.Excel.Range range = _Range(this.GetAix(x, y), miss);