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

如何在C#中访问并修改xlsm文件中的文本框?

在C#中访问Excel文本框的正确方法

你当前代码的核心错误是用操作工作表列的GetColumn方法去访问文本框——文本框属于工作表的「形状/控件集合」,而非列对象,所以这行代码必然报错。下面分不同的常用库给出正确的实现方式:

一、使用微软Office Interop Excel(需安装Office)

这是原生操作Excel的方式,支持所有类型的文本框(普通形状文本框、ActiveX文本框):

using Microsoft.Office.Interop.Excel;
using System;
using System.Windows.Forms;

private void button1_Click(object sender, EventArgs e)
{
    Application excelApp = null;
    Workbook workbook = null;
    Worksheet sheet = null;

    try
    {
        excelApp = new Application();
        // 打开目标工作簿
        workbook = excelApp.Workbooks.Open(@"C:\template\format.xlsm");
        // 获取第一个工作表(也可通过名称指定,如Worksheets["Sheet1"])
        sheet = workbook.Worksheets[1];

        // 单元格赋值正常执行
        sheet.Range["B11"].Value = "5";

        // 1. 查找普通形状文本框(非ActiveX)
        foreach (Shape shape in sheet.Shapes)
        {
            if (shape.Name.Equals("CX_4", StringComparison.OrdinalIgnoreCase) 
                && shape.Type == MsoShapeType.msoTextBox)
            {
                shape.TextFrame2.TextRange.Text = "11";
                break;
            }
        }

        // 2. 如果是ActiveX文本框,需要从OLEObjects集合查找
        foreach (OLEObject oleObj in sheet.OLEObjects())
        {
            if (oleObj.Name.Equals("CX_4", StringComparison.OrdinalIgnoreCase) 
                && oleObj.ProgID == "Forms.TextBox.1")
            {
                var textBox = oleObj.Object as TextBox;
                textBox.Text = "11";
                break;
            }
        }

        // 保存并关闭
        workbook.SaveAs(@"C:\template\XMLCopy.xlsm");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"操作出错:{ex.Message}");
    }
    finally
    {
        // 务必释放Excel资源,避免进程残留
        workbook?.Close(false);
        excelApp?.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
    }
}

二、使用EPPlus(无需安装Office,流行的开源库)

如果使用EPPlus操作Excel,文本框属于工作表的Drawings集合:

using OfficeOpenXml;
using OfficeOpenXml.Drawing;
using System.IO;
using System.Windows.Forms;

private void button1_Click(object sender, EventArgs e)
{
    var sourcePath = @"C:\template\format.xlsm";
    var savePath = @"C:\template\XMLCopy.xlsm";

    try
    {
        FileInfo sourceFile = new FileInfo(sourcePath);
        using (ExcelPackage package = new ExcelPackage(sourceFile))
        {
            ExcelWorksheet sheet = package.Workbook.Worksheets.First();

            // 单元格赋值
            sheet.Cells["B11"].Value = "5";

            // 查找名称为CX_4的文本框
            foreach (ExcelShape shape in sheet.Drawings.Shapes)
            {
                if (shape.Name.Equals("CX_4", StringComparison.OrdinalIgnoreCase)
                    && shape.ShapeType == eShapeStyle.TextBox)
                {
                    shape.Text = "11";
                    break;
                }
            }

            // 保存文件
            package.SaveAs(new FileInfo(savePath));
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"操作出错:{ex.Message}");
    }
}

关键注意点

  • 确认文本框的准确名称:打开Excel文件,选中文本框,在顶部的名称框(单元格名称旁边)查看其真实名称,避免拼写错误。
  • 区分文本框类型:普通文本框属于Shapes集合,ActiveX文本框属于OLEObjects集合,需要对应查找。

内容的提问来源于stack exchange,提问作者Francisco Javier Espinosa L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:55:30