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

//使用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(); 

怎么了? 怎么做?

要回答为什么使用First()方法的exception – 我会打赌你的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调用,你将得到运行时exception:

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

如果您注释掉生成错误的行,那么结果表中的单元格是否合并? 如果是,请尝试简单地为单元格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 

正确设置单元格值。

只是一个建议:使用“使用”

并且您的代码稍有变化:

  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(); } 

我认为范围不再被认可,因为你合并了它

EDIT1:

这段代码对我来说就像一个魅力。 我认为你不需要.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(); }