C# Excel打开多个文件时用程序关闭指定一个文件(不是杀掉进程)

复制代码
private void button1_Click(object sender, EventArgs e)
{
    CloseExcelWorkbook("TestReport.xlsx");
}

//put the following abbreviation to the "using" block: using Excel = Microsoft.Office.Interop.Excel;
internal void CloseExcelWorkbook(string workbookName)
{
    try 
    {           
        Process[] plist = Process.GetProcessesByName("Excel", ".");
        if (plist.Length  > 1)
            throw new Exception("More than one Excel process running.");
        else if (plist.Length == 0)
             throw new Exception("No Excel process running.");

        Object obj = Marshal.GetActiveObject("Excel.Application");

        Excel.Application excelAppl = (Excel.Application)obj;

        Excel.Workbooks workbooks = excelAppl.Workbooks;
        foreach (Excel.Workbook wkbk in workbooks )
        {
            if (wkbk.Name == workbookName)
                wkbk.Close();
        }
        //dispose
        //workbooks.Close(); //this would close all workbooks
        GC.Collect();
        GC.WaitForPendingFinalizers();
        if (workbooks != null)
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbooks);
        //excelAppl.Quit(); //would close the excel application
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excelAppl);
        GC.Collect();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
复制代码

注意  如果由于以下 Marshal.GetActiveObject("Excel.Application")  出错.则不要用管理员身份运行即可,(多进程时测试中发现是可以关闭对应的)

posted @   望着天的蜗牛  阅读(1099)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示