EPPlus 7.3.2跨工作簿复制工作表报错:对象引用未设置为实例
排查Workbook.Worksheets.Add复制工作表时的空引用错误
可能的原因及解决方案
1. 源工作簿已提前释放或关闭
虽然你能访问源工作表的属性,但这些属性可能来自对象的内存缓存,而非活跃的工作簿上下文。如果源Workbook在复制操作前已被Dispose、关闭或超出作用域,工作表对象会失去有效关联,导致复制时触发空引用错误。
- 解决:确保源工作簿在复制完成前保持打开状态。比如使用
using块包裹源工作簿操作,将复制逻辑放在块内部,避免提前释放资源。
2. 源工作表对象无效
即使能读取工作表属性,也可能该工作表已被标记为删除,或是通过错误方式获取的(比如索引越界但未抛出即时异常)。
- 解决:在复制前增加有效性校验:
同时确认获取源工作表的逻辑正确,比如通过if (sourceSheet != null && sourceSheet.Parent != null) { // 执行复制操作 }sourceWorkbook.Worksheets[index]或sourceWorkbook.Worksheets[name]正常获取,确保目标工作表确实存在于源工作簿中。
3. 目标工作簿处于只读状态
如果目标工作簿以只读模式打开,尝试修改其工作表结构(添加复制的工作表)会触发异常,部分库会以空引用错误的形式抛出。
- 解决:打开目标工作簿时明确设置可写模式,例如:
var targetWorkbook = new Workbook(@"C:\Target.xlsx", new LoadOptions { ReadOnly = false });
4. 工作表名称冲突(异常信息误导)
部分Excel操作库在遇到目标工作簿存在同名工作表时,不会直接抛出名称冲突异常,而是返回空引用错误。
- 解决:添加前检查目标工作簿的工作表名称,确保要添加的名称唯一:
string newSheetName = sourceSheet.Name; int suffix = 1; while (targetWorkbook.Worksheets.Any(s => s.Name.Equals(newSheetName, StringComparison.OrdinalIgnoreCase))) { newSheetName = $"{sourceSheet.Name}_{suffix++}"; } targetWorkbook.Worksheets.Add(newSheetName, sourceSheet);
完整示例代码
using System.IO; using System.Linq; using YourExcelLibraryNamespace; // 替换为你使用的Excel库命名空间 class Program { static void Main() { string targetPath = @"C:\Merged_Result.xlsx"; string sourceFolder = @"C:\Your_Source_Folder"; // 创建新的目标工作簿 var targetWorkbook = new Workbook(); foreach (var filePath in Directory.GetFiles(sourceFolder, "*.xlsx")) { // 打开源工作簿,确保在复制期间保持打开 using (var sourceWorkbook = new Workbook(filePath)) { foreach (Worksheet sourceSheet in sourceWorkbook.Worksheets) { // 生成唯一工作表名称 string uniqueName = sourceSheet.Name; int counter = 1; while (targetWorkbook.Worksheets.Any(s => s.Name.Equals(uniqueName, StringComparison.OrdinalIgnoreCase))) { uniqueName = $"{sourceSheet.Name}_{counter}"; counter++; } // 执行复制操作 targetWorkbook.Worksheets.Add(uniqueName, sourceSheet); } } } // 保存合并后的工作簿 targetWorkbook.Save(targetPath); } }
内容的提问来源于stack exchange,提问作者Scott Smith
相关产品推荐
相关产品推荐

