You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#获取当前已打开的活动Excel工作簿名称

解决方案

前置准备

首先需要在项目中引入Excel Interop程序集,两种方案可选:

  • 传统COM引用:在VS中右键项目→「添加」→「引用」→「COM」选项卡,找到并勾选Microsoft Excel 16.0 Object Library(对应Excel 2016版本)
  • NuGet安装:直接搜索安装Microsoft.Office.Interop.Excel包,适配32/64位Excel 2016,无需手动查找COM组件

核心实现代码

首先引入必要命名空间:

using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

获取活动工作簿并写入数据的示例代码:

private void WriteToActiveExcelWorkbook(string writeContent)
{
    Excel.Application excelApp = null;
    Excel.Workbook activeWorkbook = null;
    Excel.Worksheet activeWorksheet = null;

    try
    {
        // 获取当前正在运行的Excel实例
        excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
        // 获取当前活动工作簿
        activeWorkbook = excelApp.ActiveWorkbook;
        if (activeWorkbook == null)
        {
            // 无打开的工作簿时的异常处理逻辑
            throw new InvalidOperationException("未检测到已打开的Excel工作簿");
        }
        // 获取当前活动工作表
        activeWorksheet = (Excel.Worksheet)activeWorkbook.ActiveSheet;

        // 示例:将ComboBox的内容写入活动工作表第2行第3列(即C2单元格),可自行修改行列索引
        // 注意:Excel行列索引从1开始计数
        activeWorksheet.Cells[2, 3] = writeContent;

        // 可选:如果需要自动保存修改
        // activeWorkbook.Save();
    }
    catch (COMException ex) when ((uint)ex.ErrorCode == 0x800401E3)
    {
        // 未检测到运行中的Excel实例的异常处理
        throw new InvalidOperationException("未检测到正在运行的Excel程序,请先打开目标工作簿");
    }
    finally
    {
        // 必须释放COM对象,避免Excel进程残留后台
        if (activeWorksheet != null) Marshal.ReleaseComObject(activeWorksheet);
        if (activeWorkbook != null) Marshal.ReleaseComObject(activeWorkbook);
        if (excelApp != null) Marshal.ReleaseComObject(excelApp);
    }
}

调用示例(ComboBox值写入时调用):

// 取ComboBox选中值传入方法即可,无选中时可自行加空值判断
WriteToActiveExcelWorkbook(comboBox1.SelectedItem?.ToString());

适配多工作簿场景

如果需要操作指定的非活动工作簿,可遍历Excel实例的工作簿集合匹配文件名:

// 替换为你要找的工作簿文件名,例如"测试表.xlsx"
string targetWorkbookName = "目标工作簿.xlsx";
Excel.Workbook targetWorkbook = null;
foreach (Excel.Workbook wb in excelApp.Workbooks)
{
    if (wb.Name.Equals(targetWorkbookName, StringComparison.OrdinalIgnoreCase))
    {
        targetWorkbook = wb;
        break;
    }
}

注意事项

  • 位数适配:项目属性→「生成」选项卡中,若勾选「Any CPU」需取消勾选「首选32位」,确保程序位数与安装的Excel版本适配,避免COM调用报错
  • 权限匹配:不要以管理员权限运行你的程序,除非Excel也以管理员权限启动,跨权限场景下无法获取到运行中的Excel实例
  • 异常处理:建议自行补充用户未打开Excel、选中工作簿被保护等场景的异常提示逻辑

内容的提问来源于stack exchange,提问作者jrdnoland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:18:02