如何在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
相关产品推荐
相关产品推荐

