C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案
一年前,从网上到一些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); | |
发布评论