设置单元格合并并设置其值,但不起作用?
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
因为 mergedId
是 A1: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()
即可获得您想要的内容,但我认为我至少解决了这个问题。
//使用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
因为 mergedId
是 A1: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()
即可获得您想要的内容,但我认为我至少解决了这个问题。