设置单元格合并并设置其值,但不起作用?

Set cells merged and set its value, but it not work?

//使用EPPlus.dll

使用 OfficeOpenXml

string path = @"C:\Users\Superman\Desktop\recc96.xlsx";
            ExcelPackage package = new ExcelPackage(new FileInfo(path));
            var sheet3 = package.Workbook.Worksheets[3];
            sheet3.Cells["A1:B5"].Merge = true;
            var mergedId = sheet3.MergedCells[1, 1];
            sheet3.Cells[mergedId].First().Value = "123"; // error: System.InvalidOperationException : Sequence does not contain any elements
            package.Save();

怎么了?怎么做?

只是一个建议:使用 "using"

并对您的代码做一点小改动:

    using (ExcelPackage package = new ExcelPackage(new FileInfo(path)))
    {
        var sheet3 = package.Workbook.Worksheets[3];
        sheet3.Cells["A1:B5"].Merge = true;
        var mergedId = sheet3.MergedCells[1, 1];
        sheet3.Cells["A1"].Value = "123"; 
        package.Save();
    }

我认为该范围不再被识别,因为您已经合并了它

编辑 1:

这段代码对我来说就像一个魅力。我认为你不需要 .First()

using (ExcelPackage package = new ExcelPackage(new FileInfo(path)))
            {
                var sheet3 = package.Workbook.Worksheets[3];
                sheet3.Cells["A1:B5"].Merge = true;
                var mergedId = sheet3.MergedCells[1, 1];
                sheet3.Cells[mergedId].Value = "123";
                package.Save();
            }

如果注释掉产生错误的行,结果 sheet 中的单元格是否合并?如果是,请尝试简单地为单元格 A1 分配一个值,看看是否可行。

希望对您有所帮助

您上面的示例代码中已经有一个内联 ExcelRange

sheet3.Cells["A1:B5"].Merge = true;

所以保存一个引用,并用它来设置合并后的单元格值:

using (var package = new ExcelPackage(new FileInfo(path)))
{
    var sheet3 = package.Workbook.Worksheets[3];
    var range = sheet3.Cells["A1:B5"];
    range.Merge = true;
    sheet3.Cells[range.Start.Address].Value = "123";
    package.Save();
}

现在无需计算或硬编码单元格地址或索引。换句话说,当您这样做时:

var mergedId = sheet3.MergedCells[1, 1];

代码抛出 System.InvalidOperationException 因为 mergedIdA1:B5

反之:

range.Start.Address // A1

正确设置单元格值。

回答为什么使用 First() 方法会出现异常 - 我敢打赌你在 excel 中的 sheet3 是空的。请记住,Cells 对象仅包含对具有 实际 内容的单元格的引用。但是,如果 excel 中的所有单元格都是空的,那么 EPPlus 中的 Cells 集合也是空的。

例如,这在创建全新 sheet:

时效果很好
using (var package = new ExcelPackage(fi))
{
    var brandNewSheet = package.Workbook.Worksheets.Add("BrandNewSheet");
    brandNewSheet.Cells["A1"].LoadFromCollection(new[] {"A", "B", "C", "D", "E"});
    brandNewSheet.Cells["B1"].LoadFromCollection(new[] {"A", "B", "C", "D", "E"});
    brandNewSheet.Cells["A1:B5"].Merge = true;
    var mergedId = brandNewSheet.MergedCells[1, 1];
    brandNewSheet.Cells[mergedId].First().Value = "123";
    package.Save();
}

但是如果您注释掉 LoadFromCollection 调用,您将得到运行时异常:

using (var package = new ExcelPackage(fi))
{
    var brandNewSheet = package.Workbook.Worksheets.Add("BrandNewSheet");
    //brandNewSheet.Cells["A1"].LoadFromCollection(new[] {"A", "B", "C", "D", "E"});
    //brandNewSheet.Cells["B1"].LoadFromCollection(new[] {"A", "B", "C", "D", "E"});
    brandNewSheet.Cells["A1:B5"].Merge = true;
    var mergedId = brandNewSheet.MergedCells[1, 1];
    brandNewSheet.Cells[mergedId].First().Value = "123"; //Cells is empty so: System.InvalidOperationException: Sequence contains no elements
    package.Save();
}

正如其他人所解释的那样,无需调用 First() 即可获得您想要的内容,但我认为我至少解决了这个问题。