C#导出Excel后关闭进程EXCELEXE释放资源的解决方案.docx
《C#导出Excel后关闭进程EXCELEXE释放资源的解决方案.docx》由会员分享,可在线阅读,更多相关《C#导出Excel后关闭进程EXCELEXE释放资源的解决方案.docx(30页珍藏版)》请在冰豆网上搜索。
C#导出Excel后关闭进程EXCELEXE释放资源的解决方案
C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案
2009年2月3日[9,330views]发表评论阅读评论
一年前,从网上找到一些C#导出MSExcel的例子,但是都不能彻底销毁其所创建的Excel进程,典型的就是进程中的EXCEL.EXE不能关掉。
网上的解决方案大部分是kill掉所有的Excel进程,偶一直感觉不爽。
最近,做了几个月的WinForm,接触了一些进程、句柄方面的知识。
于是试着解决一下,没想到成功了,创建的Excel进程被成功Kill掉了,而其它Excel进程则相安无事。
关键代码:
publicvoidKillSpecialExcel()
{
try
{
if(m_objExcel!
=null)
{
intlpdwProcessId;
GetWindowThreadProcessId(newIntPtr(m_objExcel.Hwnd),outlpdwProcessId);
System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
}
}
catch(Exceptionex)
{
Console.WriteLine("DeleteExcelProcessError:
"+ex.Message);
}
}
操作生成Excel的全部代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Reflection;
usingSystem.Runtime.InteropServices;
usingSystem.Drawing;
namespaceVeryCodes.Common.MyExcel
{
///
///ExcelClass的摘要说明。
///
publicclassMSExcel
{
///
///构建ExcelClass类
///
publicMSExcel()
{
//别忘了需要添加ExcelLibrary的引用
this.m_objExcel=newMicrosoft.Office.Interop.Excel.Application();
}
///
///构建ExcelClass类
///
///
Excel.Application
publicMSExcel(Microsoft.Office.Interop.Excel.ApplicationobjExcel)
{
this.m_objExcel=objExcel;
}
///
///列标号,Excel最大列数是256
///
privatestring[]ALists=newstring[]{
"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"
};
///
///获取描述区域的字符
///
///
///
///
publicstringGetAix(intx,inty)
{
if(x>256){return"";}
strings="";
s=s+ALists[x-1].ToString();
s=s+y.ToString();
returns;
}
///
///给单元格赋值1
///
///
行号
///
列号
///
对齐(CENTER、LEFT、RIGHT)
///
值
publicvoidsetValue(inty,intx,stringalign,stringtext)
{
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_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
///
///
行号
///
列号
///
值
publicvoidsetValue(inty,intx,stringtext)
{
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_Range(this.GetAix(x,y),miss);
range.set_Value(miss,text);
}
///
///给单元格赋值3
///
///
行号
///
列号
///
值
///
字符格式
///
颜色
publicvoidsetValue(inty,intx,stringtext,System.Drawing.Fontfont,intcolor)
{
this.setValue(x,y,text);
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_Range(this.GetAix(x,y),miss);
range.Font.Size=font.Size;
range.Font.Bold=font.Bold;
//这里是int型的颜色
range.Font.Color=ColorTranslator.ToOle(ColorTranslator.FromWin32(color));
range.Font.Name=font.Name;
range.Font.Italic=font.Italic;
range.Font.Underline=font.Underline;
}
///
///给单元格赋值3
///
///
行号
///
列号
///
值
///
字符格式
///
颜色
publicvoidsetValue(inty,intx,stringtext,System.Drawing.Fontfont,intcolor,stringalign)
{
this.setValue(x,y,text);
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_Range(this.GetAix(x,y),miss);
range.Font.Size=font.Size;
range.Font.Bold=font.Bold;
//这里是int型的颜色
range.Font.Color=ColorTranslator.ToOle(ColorTranslator.FromWin32(color));
range.Font.Name=font.Name;
range.Font.Italic=font.Italic;
range.Font.Underline=font.Underline;
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;
}
}
///
///插入新行
///
///
模板行号
publicvoidinsertRow(inty)
{
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_Range(GetAix(1,y),GetAix(255,y));
range.Copy(miss);
range.Insert(Microsoft.Office.Interop.Excel.XlDirection.xlDown,miss);
range.get_Range(GetAix(1,y),GetAix(255,y));
range.Select();
sheet.Paste(miss,miss);
}
///
///把剪切内容粘贴到当前区域
///
publicvoidpaste()
{
strings="a,b,c,d,e,f,g";
sheet.Paste(sheet.get_Range(this.GetAix(10,10),miss),s);
}
///
///设置边框
///
///
///
///
///
///
publicvoidsetBorder(intx1,inty1,intx2,inty2,intWidth)
{
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
range.Borders.Weight=Width;
}
publicvoidmergeCell(intx1,inty1,intx2,inty2)
{
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
range.Merge(true);
}
publicMicrosoft.Office.Interop.Excel.RangegetRange(intx1,inty1,intx2,inty2)
{
Microsoft.Office.Interop.Excel.Rangerange=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
returnrange;
}
privateobjectmiss=Missing.Value;//忽略的参数OLENULL
privateMicrosoft.Office.Interop.Excel.Applicationm_objExcel;//Excel应用程序实例
privateMicrosoft.Office.Interop.Excel.Workbooksm_objBooks;//工作表集合
privateMicrosoft.Office.Interop.Excel.Workbookm_objBook;//当前操作的工作表
privateMicrosoft.Office.Interop.Excel.Worksheetsheet;//当前操作的表格
publicMicrosoft.Office.Interop.Excel.WorksheetCurrentSheet
{
get
{
returnsheet;
}
se