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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:46:12