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

时间:2017-02-23 06:49:47

标签: c# epplus

//使用EPPlus.dll

使用OfficeOpenXml

string path = @"C:\Users\Superman\Desktop\recc\1996.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();

出了什么问题?怎么做?

2 个答案:

答案 0 :(得分:2)

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

例如,这在创建全新工作表时可以正常工作:

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()来获得你想要的东西,但我认为我至少要解决这个问题。

答案 1 :(得分:1)

您的示例代码中已经有内联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

正确设置单元格值。