C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案

C#导出Excel后无法结束相应进程的解决办法 首先要关闭Excel并释放资源: excel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); GC.Collect(); GC.WaitForPendingFinalizer 阅读详情
转自 http://blog.bossma.cn/dotnet/csharp-exorpt-excel-process-kill/


C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案


2009年2月3日 | 分类: ASP.NET | 标签: excel, Process (12,693 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 = 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
        ///
        ///
行号
        ///
列号
        ///
值
        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
        ///
        ///
行号
        ///
列号
        ///
值
        ///
字符格式
        ///
颜色
        public 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.ToOle(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.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.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;
            }
        }


        ///
        /// 插入新行
        ///
        ///
模板行号
        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));
            range.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(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, 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; //忽略的参数OLENULL
        private 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 CurrentSheet
        {
            get
            {
                return sheet;
            }
            set
            {
                this.sheet = value;
            }
        }


        public Microsoft.Office.Interop.Excel.Workbooks CurrentWorkBooks
        {
            get
            {
                return this.m_objBooks;
            }
            set
            {
                this.m_objBooks = value;
            }
        }


        public Microsoft.Office.Interop.Excel.Workbook CurrentWorkBook
        {
            get
            {
                return this.m_objBook;
            }
            set
            {
                this.m_objBook = value;
            }
        }


        ///
        /// 打开Excel文件
        ///
        ///
路径
        public void OpenExcelFile(string filename)
        {
            UserControl(false);


            m_objExcel.Workbooks.Open(filename, miss, miss, miss, miss, miss, miss, miss,
                                    miss, miss, miss, miss, miss, miss, miss);


            m_objBooks = (Microsoft.Office.Interop.Excel.Workbooks)m_objExcel.Workbooks;


            m_objBook = m_objExcel.ActiveWorkbook;
            sheet = (Microsoft.Office.Interop.Excel.Worksheet)m_objBook.ActiveSheet;
        }


        public void UserControl(bool usercontrol)
        {
            if (m_objExcel == null) { return; }
            m_objExcel.UserControl = usercontrol;
            m_objExcel.DisplayAlerts = usercontrol;
            m_objExcel.Visible = usercontrol;
        }


        public void CreateExceFile()
        {
            UserControl(false);
            m_objBooks = (Microsoft.Office.Interop.Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Microsoft.Office.Interop.Excel.Workbook)(m_objBooks.Add(miss));
            sheet = (Microsoft.Office.Interop.Excel.Worksheet)m_objBook.ActiveSheet;
        }


        public void SaveAs(string FileName)
        {
            m_objBook.SaveAs(FileName, miss, miss, miss, miss,
             miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
             Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlLocalSessionChanges,
             miss, miss, miss, miss);
            //m_objBook.Close(false, miss, miss);
        }


        public void ReleaseExcel()
        {
            m_objExcel.Quit();


            System.Runtime.InteropServices.Marshal.ReleaseComObject((object)m_objExcel);
            System.Runtime.InteropServices.Marshal.ReleaseComObject((object)m_objBooks);
            System.Runtime.InteropServices.Marshal.ReleaseComObject((object)m_objBook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject((object)sheet);


            sheet = null;
            m_objBook = null;
            m_objBooks = null;
            m_objExcel = null;


            GC.Collect(0);
        }


        #region KillAllExcel
        public bool KillAllExcel()
        {
            try
            {
                if (m_objExcel != null) // isRunning是判断xlApp是怎么启动的flag.
                {
                    m_objExcel.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);
                    //释放COM组件,其实就是将其引用计数减1
                    //System.Diagnostics.Process theProc;
                    foreach (System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
                    {
                        //先关闭图形窗口。如果关闭失败...有的时候在状态里看不到图形窗口的excel了,
                        //但是在进程里仍然有EXCEL.EXE的进程存在,那么就需要杀掉它:p
                        if (theProc.CloseMainWindow() == false)
                        {
                            theProc.Kill();
                        }
                    }
                    m_objExcel = null;
                    return true;
                }
            }
            catch
            {
                return false;
            }
            return true;
        }
        #endregion


        #region Kill Special Excel Process
        [DllImport("user32.dll", SetLastError = true)]
        static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);


        //推荐这个方法,找了很久,不容易啊
        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);
            }
        }
        #endregion
    }
}


看一个例子:最关键的就是KillSpecialExcel()这个方法,找到Excel的进程ID,然后杀死这个进程。
断断续续找了很久,终于发现了这个方法。
protected void Button1_Click(object sender, EventArgs e)
    {
        MSExcel mexc = new MSExcel();
        mexc.CreateExceFile();
        mexc.insertRow(1);//注意从1开始的
        int col = (256 * 256 * 255) + (256 * 192) + 192;//颜色
        mexc.setValue(1, 1, "Demo", new Font("Arial", 18), col,"center");//设置单元格内容和样式
        mexc.mergeCell(1, 1, 4, 1);//合并单元格


        for (int i = 2; i <= 101; i++)
        {
            mexc.insertRow(i);//插入行
            for (int j = 1; j <= 4; j++)//注意从1开始的
            {
                mexc.setValue(i, j, i + "--" + j);//设置单元格内容
            }
        }


        mexc.SaveAs(@"d:\demo.xls");//保存文件
        mexc.KillSpecialExcel();//关闭创建的Excel进程
    }


这似乎是一个完美的解决方案了,但是速度实在不敢保证,而且耗费的内存和CPU资源也比较多。其它方面还没有测试,有兴趣的话可以自己试试。
对于用户少较少的应用还可以凑合,并发多了,真不敢想象。




以前还用过生成csv文件的方法,但是格式没办法设置;
我想能不能直接构建excel的代码格式,然后保存成.xls,但是一直还没有成功。

C# 调用Office Excel 接口方法Quit(),但是Excel进程不退出的解决办法 相信在C# 中使用过EXCEL的人都遇到过调用 ExcelApplication.Quit() ,但是 Excel进程依然存在的情况: Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); //Do your work... 阅读详情

相关推荐

C# 常用Excel导出的几种常见方式及实现步骤

在C#中,常用的Excel 文件导出方式包括:使用 Microsoft Office Interop Excel 组件,使用 NPOI 组件导出 Excel 文件,使用 EPPlus 组件导出Excel文件,使用 ClosedXML 组件导出 Excel 文件四种常用方式,以下仅根据这四种Excel导出方式展开介绍其实现步骤,并列举出示例代码,仅供大家学习参考,欢迎大家留言

beenles的博客 8076

C#使用Microsoft.Office.Interop进行EXCEL操作时彻底关闭EXCEL进程

当我们使用Excel操作时候,发现总是不能退出,可以这么办 IntPtr t = new IntPtr(xlsApplication.Hwnd); int k = 0; GetWindowThreadProcessId(t, out k); System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); p.Kill();

cybersnow精通 28 门计算机语言,凭借其超凡的技术能力,成功开发过上万个应用,广泛涉及政府、商业、个人等众多领域,甚至在检察院、环保局、公安局等专业场景中也大放异彩。不仅熟练掌握单片机和物联网开发,在软件架构设计方面更是独树一帜,自创了跨平台软件 1774

C#创建Excel文件并将数据导出到Excel文件

C#创建Excel文件,这里实际上是从资源中提取一个事先创建好的Excel文件,文件提取成功后,使用OleDb方法连接Excel,向Excel文件中写入数据。创建解决方案菜单》新建》项目》Windows窗体应用程序:添加相关组件:添加两个DataGridView,一个TextBox,两个按钮 ,如下图:添加Excel资源:先在文件夹中新建一个Excel文件,在Sheet1表的第一行设置列名:双击“

无知人生,记录点滴 4万+

C#操作Excel,调用ApplicationClass.Quit()关闭Excel时,发生异常:Microsoft Office Word 遇到问题需要关闭...

应将ApplicationClass.Quit();  放在所有的 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);后面,如:   if (xlApp != null)                {                    System.Runtime.InteropServices.Marshal...

weixin_34366546的博客 691

C#彻底关闭Excel进程excel.exe

C#彻底关闭Excel进程excel.exe

C#无法关闭Excel进程的解决办法.

C#无法关闭Excel进程的解决办法.转载的.

Excel对象使用后进程不能退出的完美解决办法

主要原因是:程序并没有完全释放掉使用的资源,虽然程序正常关闭,程序本身也可以自动释放原来使用的资源,但Excel进程并不能判断到,只要Excel使用的资源有没有释放的,Excel进程就不会关闭。解决办法:使用完Excel.Application对象后,关闭所有使用资源。如:app._Workbools / Sheets / _Workbook 等,最后 app.Quit()。以下是我写的一个分析指

sytWeibo的专栏 7494

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

C#和Asp.net下excel进程一被打开,有时就无法关闭,尤其是website.对关闭该进程有过GC、release等方法,但这些方法并不是在所有情况下均适用

C#导出Excel后关闭进程EXCEL.EXE

在C#中使用Microsoft.Office.Interop.Execl 导出excel 表格时,将以下两个属性亩后,在导完后, Excel.exe 进程无法关闭。 // excel app 是否可见app.Visible = false;  // app 为Microsoft.Office.Interop.Excel.Application 的实例对象 app.DisplayAlerts = ...

tmjianjun的博客 1804

Qt Design Studio 入门指南:从零开始打造炫酷UI(详细+实用+轻松上手)

本文是Qt Design Studio的详细入门指南,旨在帮助UI设计新手从零开始轻松打造炫酷界面。文章系统介绍了软件的核心概念、安装步骤、主界面解析,并通过创建一个完整的登录界面实例,手把手教学如何拖拽组件、设置属性、添加交互状态与动画。同时,分享了创建自定义组件、管理资源以及提升效率的实用技巧与常见问题解决方案,让读者能够快速上手并应用于实际项目开发。

devops8pract的博客 588

【新手必看】蓝牙的HOGP和HID、GATT有什么区别和联系

让新手宏观了解蓝牙HOGP、HID、GATT这三个协议的区别和联系

qq_51976334的博客 1565

C#读取excel后不能关闭excel.exe

http://www.cnblogs.com/wang_yb/archive/2010/05/02/1726135.html http://blog.csdn.net/kable999/article/details/5057507 http://www.blogjava.net/tank414/archive/2006/11/04/excel.html C#和Asp.net

zouahaijun的专栏 1380

3D Slicer中安装MedSAM插件

大家应该都读过这篇论文:《Segment Anything in Medical Images》这个插件便是该论文团队推出的在3D Slicer上使用的插件,可以分割医学图像的任何感兴趣区域。

m0_73719342的博客 2330

C#Microsoft Excel 16.0 Object Library使用Excel后自动释放资源,关闭后台运行进程方法

技术是好的与坏的,好人用技术是更好的,坏人用技术是更坏的。还有柏拉图的《理想国》、[法]孟德斯鸠的《论法的精神》、哈耶克《通向奴役之路》(港版)(港版翻译较好大陆版本,英语过硬的最好看英文原版),现在网店都有售卖!见多识广,包容的人更自信、思维更多元,包容好的文化使人更强大,越自信越包容越强大!柏拉图在他的巨著《理想国》的第七卷里写到了洞穴理论阐明:一群从小被囚禁生活在洞穴里人,在洞穴外面的光线照明下,往内看是一片片黑影,往外看是光明的海阔天空,越看越明亮!

m0_58015531的博客 1751

告别有线:用PVE直通无线网卡,打造一台真正的‘无线’Win10软路由/测试机

本文详细介绍了如何通过PVE直通无线网卡技术,构建全无线Win10软路由或测试机。从硬件选型、PVE环境配置到PCIe和USB双模直通技术,逐步指导实现Wi-Fi AP和蓝牙连接功能,为家庭实验室和小型办公环境提供灵活高效的网络解决方案。

weixin_28683689的博客 586

MobaXterm破解14个会话限制的保姆级教程(附Python环境配置指南)

本文提供了MobaXterm破解14个会话限制的详细教程,并深入讲解了如何配置稳定的Python环境以支持相关脚本运行。通过理解软件授权机制、安全实践步骤以及许可文件的应用,帮助用户解除会话数量限制,实现高效的远程服务器管理与自动化运维。

weixin_29211309的博客 1641

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

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

goodjie_12的专栏 874

Coze HTTP请求节点实战:5分钟搞定天气API对接(含动态参数技巧)

本文通过一个天气预报API对接的实战案例,详细讲解了如何在Coze平台使用HTTP请求节点实现外部数据交互。文章重点演示了动态参数传递、JSON响应解析与错误处理等核心技巧,帮助开发者在5分钟内快速构建稳定可靠的智能体外部服务调用能力。

weixin_29233333的博客 675

ASP.NET导出Excel并将Excel进程关闭 (根据进程ID)

开发工作中经常遇到跟Excel打交道的地方,但在ASP.NET中使用完Excel后往往不能将其关闭,导致服务器上的Excel进程越来越多.本文介绍一个直接将进程KILL的方法,根据进程ID来KILL,不会影响其他用户的操作. 完整EXCEL导出及结束代码参考如下: using System; using System.Collections; using System.Configuratio

kogu的博客 5506

微信小程序逆向实战:从HTTPS抓包到API接口全解构

方案原理优点缺点方案一:使用低版本微信+系统代理微信7.0以下版本未强制不走代理操作简单容易被封号,无法使用新版小程序方案二:Hook SSL层(Xposed/Frida)动态Hook Java的TrustManager或系统的SSLContext,绕过证书校验灵活可控需要Root/越狱,技术门槛高方案三:VPN转发抓包(PacketCapture)利用Android VPNService将所有流量转发到本地代理无需Root,兼容性好部分机型存在性能问题。

2201_76125261的博客 266

JavaFx 教程

JavaFx 教程

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 784

C# 如何关闭,释放Excel进程

注: 不允许调用对象的Application属性,否则资源释放无效。 例: Excel.Application excelApp = new Excel.Application(); excelApp.Application.DisplayAlerts = false;( excelApp.DisplayAlerts = false;) 如果代码中有以上类似调用的话,资源释放将无效。

杨礼凯的专栏 8686

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 资源管理器双击弹出新窗口或普通文件列表窗口双击弹出资源管理器的解决方法
下一篇: SQL SERVER中错误delete语句可能误删除所有记录
sgchen
博客等级 码龄22年 6粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值