ExcelRange中的单元格
本文关键字:单元格 ExcelRange | 更新日期: 2023-09-27 18:03:03
这个问题把我难住了。
我有一个Excel文档,它加载得很好。它有行,列和数据我想遍历这些行。但EPPLus很奇怪。
我取第二行
ExcelRange range1 = worksheet.Cells[2, worksheet.Dimension.Start.Column, 2, worksheet.Dimension.End.Column];
这给了我{A2:D2}
灿烂!到目前为止,一切顺利,但我想要一行的第一个单元格:
ExcelRange range2 = range1[1,1];
给我{A1}
,更糟糕的是,range1
的值也变成了{A1}
,而不是我选择的行。
如何解决此问题并从ExcelRange中获取ExcelRange?
这让我完全困惑....谢谢你的帮助
我确实有同样的问题,以获得正确的开始单元格:
var range2 = worksheet.Cells[range1.Start.Row, range1.Start.Column];
右下角的单元格也是如此:
var range3 = worksheet.Cells[range1.End.Row, range1.End.Column];
如果您查看ExcelRange
Indexer背后的代码,您将看到get
实际上会设置基址(嵌套的else
):
public ExcelRange this[string Address]
{
get
{
if (_worksheet.Names.ContainsKey(Address))
{
if (_worksheet.Names[Address].IsName)
{
return null;
}
else
{
base.Address = _worksheet.Names[Address].Address;
}
}
else
{
base.Address = Address;
}
_rtc = null;
return this;
}
}
他们为什么这样做我不确定(我认为这是一个实现细节)。但这就解释了为什么引用另一个地址会改变选择范围。所以,就像Benexx说的,必须从Worksheet
的Cells
集合中做一个直接引用。
您可以使用Offset方法来获取ExcelRange的子范围。这将为您提供一个新的ExcelRange实例,而不会修改原始实例。
https://www.epplussoftware.com/docs/5.5/api/OfficeOpenXml.ExcelRangeBase.html OfficeOpenXml_ExcelRangeBase_Offset_System_Int32_System_Int32_System_Int32_System_Int32_
下面是一个例子:
public static void AlternateRowColor(ExcelRange range)
{
for (var rowOffset = 1; rowOffset < range.Rows; rowOffset += 2)
{
using (var rowRange = range.Offset(rowOffset, 0, 1, range.Columns))
{
rowRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
rowRange.Style.Fill.BackgroundColor.SetColor(Color.Cornsilk);
}
}
}