【问题标题】:Cell from ExcelRangeExcelRange 中的单元格
【发布时间】:2016-08-19 13:06:51
【问题描述】:

这个问题让我完全不解。

我有一个加载得很好的 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?

这让我完全困惑....感谢您的帮助

【问题讨论】:

  • 你为什么首先尝试从其他范围获取范围?
  • 该文档包含一个带有数据行的数据结构。每一行都必须经过验证。在那里,我获取该行并将其转发给验证该行的方法

标签: c# .net epplus


【解决方案1】:

我确实有同样的问题,要获得正确的起始单元格:

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

右下角的单元格也是如此:

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

【讨论】:

  • 但例如我想从 range2 中取出第一个单元格
  • 我猜你也可以使用 var range2 = range1[range1.Start.Row, range1.Start.Column];
【解决方案2】:

如果您查看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 说的,必须从 Worksheet 的 Cells 集合中直接引用。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 2014-01-11
      • 2014-12-13
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多