来自ExcelRange的单元格

时间:2016-08-19 13:06:51

标签: c# .net epplus

这个问题让我完全不解。

我有一个Excel文档加载得很好。 它有行,列和数据,我想遍历行。 但EPPLus很奇怪。

我采取第二行:

ExcelRange range1 = worksheet.Cells[2, worksheet.Dimension.Start.Column, 2, worksheet.Dimension.End.Column];

这给了我{A2:D2} Splendid!到目前为止这么好,但后来我想要该行的第一个单元格:

ExcelRange range2 = range1[1,1];

哪个给了我{A1}并且更糟糕的是,range1的值也变为{A1}而不是我选择的行。

如何解决此问题并从ExcelRange中获取ExcelRange?

这让我完全感到困惑....感谢anyhelp

3 个答案:

答案 0 :(得分:3)

我确实遇到了同样的问题,以获得正确的起始单元格:

var range2 = worksheet.Cells[range1.Start.Row, range1.Start.Column];

右下角的细胞也一样:

var range3 = worksheet.Cells[range1.End.Row, range1.End.Column];

答案 1 :(得分:1)

如果查看ExcelRange索引器后面的代码,您会看到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所说,必须从Cells的{​​{1}}集合中直接引用。

答案 2 :(得分:0)

您可以使用 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);
        }
    }
}