C#免费修改Excel文件且保留宏、文本框等元素方案咨询
免费修改Excel并保留宏、文本框等元素的方案
方案1:NPOI(Apache License 2.0,完全免费)
NPOI是.NET平台下的开源Excel处理库,支持读写xlsx/xlsm格式,能完整保留原有文件中的宏、文本框、形状等元素,无商用限制。
操作步骤
- 安装NuGet包:
Install-Package NPOI Install-Package NPOI.OOXML
- 修改Excel的代码示例:
using NPOI.XSSF.UserModel; using System.IO; string templatePath = @"C:\template\from123.xlsx"; string outputPath = @"C:\template\XMLCopy.xlsx"; using (FileStream fs = new FileStream(templatePath, FileMode.Open, FileAccess.ReadWrite)) { XSSFWorkbook workbook = new XSSFWorkbook(fs); // 获取第一个工作表 var sheet = workbook.GetSheetAt(0); // 定位B11单元格(NPOI行/列从0开始计数,B11对应行10、列1) var cell = sheet.GetRow(10)?.GetCell(1); cell ??= sheet.GetRow(10).CreateCell(1); cell.SetCellValue("5"); // 保存文件,自动保留宏、文本框等原有元素 using (FileStream outputFs = new FileStream(outputPath, FileMode.Create, FileAccess.Write)) { workbook.Write(outputFs); } }
方案2:EPPlus 4.x(MIT License,免费商用)
EPPlus 4.x版本采用MIT协议,完全免费可商用,支持处理xlsm文件并保留VBA宏和形状。注意5.x及以后版本改为非商用授权,商用需付费。
操作步骤
- 安装指定版本的NuGet包:
Install-Package EPPlus -Version 4.5.3.3
- 修改Excel的代码示例:
using OfficeOpenXml; using System.IO; // 设置许可证上下文(4.x版本必填) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; string templatePath = @"C:\template\from123.xlsx"; string outputPath = @"C:\template\XMLCopy.xlsx"; FileInfo templateFile = new FileInfo(templatePath); using (ExcelPackage package = new ExcelPackage(templateFile)) { // 获取第一个工作表 var sheet = package.Workbook.Worksheets[0]; // 修改B11单元格的值 sheet.Cells["B11"].Value = "5"; // 保留原有VBA宏(仅适用于xlsm格式文件) package.Workbook.VbaProject = templateFile.OpenRead(); // 保存文件,保留所有原有元素 package.SaveAs(new FileInfo(outputPath)); }
关于ClosedXML丢失元素的原因
ClosedXML本身不支持VBA宏的读写,对Excel中的形状(如文本框)支持也有限,保存文件时会自动过滤这些不兼容元素,因此导致宏和文本框丢失。
内容的提问来源于stack exchange,提问作者Francisco Javier Espinosa L
相关产品推荐
相关产品推荐

