1、C#导出Excel后关闭进程EXCELEXE释放资源的解决方案C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案2009年2月3日 9,330 views 发表评论 阅读评论 一年前,从网上找到一些C#导出MS Excel的例子,但是都不能彻底销毁其所创建的Excel进程,典型的就是进程中的EXCEL.EXE不能关掉。网上的解决方案大部分是kill掉所有的Excel进程,偶一直感觉不爽。最近,做了几个月的WinForm,接触了一些进程、句柄方面的知识。于是试着解决一下,没想到成功了,创建的Excel进程被成功Kill掉了,而其它Excel进程则相安无事。关键代码:public
2、 void KillSpecialExcel()tryif (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的全部代码:
3、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 Mi
4、crosoft.Office.Interop.Excel.Application();/ 构建ExcelClass类/Excel.Applicationpublic 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,
5、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,
6、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,
7、 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
8、, IT, IU, IV;/ 获取描述区域的字符/public string GetAix(int x, int y)if (x 256) return ; string s = ;s = s + AListsx - 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 = she
9、et.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.ToUp
10、per() = 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 = sheet.get_Range(this.GetAix(x, y), miss);range.set_Value(miss, text);/ 给单元格赋值3/行号/列号/值/字符格式/颜色p
11、ublic void setValue(int y, int x, string text, System.Drawing.Font font, int color)this.setValue(x, y, text);Microsoft.Office.Interop.Excel.Range range = sheet.get_Range(this.GetAix(x, y), miss);range.Font.Size = font.Size;range.Font.Bold = font.Bold;/这里是int型的颜色range.Font.Color = ColorTranslator.ToO
12、le(ColorTranslator.FromWin32(color);range.Font.Name = font.Name;range.Font.Italic = font.Italic;range.Font.Underline = font.Underline;/ 给单元格赋值3/行号/列号/值/字符格式/颜色public void setValue(int y, int x, string text, System.Drawing.Font font, int color, string align)this.setValue(x, y, text);Microsoft.Office.
13、Interop.Excel.Range range = 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.Un
14、derline;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
15、.Interop.Excel.XlHAlign.xlHAlignRight;/ 插入新行/模板行号public void insertRow(int y)Microsoft.Office.Interop.Excel.Range range = 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);r
16、ange.Select();sheet.Paste(miss, miss);/ 把剪切内容粘贴到当前区域/public void paste()string s = a,b,c,d,e,f,g;sheet.Paste(sheet.get_Range(this.GetAix(10, 10), miss), s);/ 设置边框/public void setBorder(int x1, int y1, int x2, int y2, int Width)Microsoft.Office.Interop.Excel.Range range = sheet.get_Range(this.GetAix(
17、x1, y1), this.GetAix(x2, y2);range.Borders.Weight = Width;public void mergeCell(int x1, int y1, int x2, int y2)Microsoft.Office.Interop.Excel.Range range = sheet.get_Range(this.GetAix(x1, y1), this.GetAix(x2, y2);range.Merge(true);public Microsoft.Office.Interop.Excel.Range getRange(int x1, int y1,
18、int x2, int y2)Microsoft.Office.Interop.Excel.Range range = sheet.get_Range(this.GetAix(x1, y1), this.GetAix(x2, y2);return range;private object miss = Missing.Value; /忽略的参数OLENULLprivate Microsoft.Office.Interop.Excel.Application m_objExcel;/Excel应用程序实例private Microsoft.Office.Interop.Excel.Workbooks m_objBooks;/工作表集合private Microsoft.Office.Interop.Excel.Workbook m_objBook;/当前操作的工作表private Microsoft.Office.Interop.Excel.Worksheet sheet;/当前操作的表格 public Microsoft.Office.Interop.Excel.Worksheet CurrentSheetgetreturn sheet;se
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1