【问题标题】:How to determine which cells in a merged range are visible and can have a value?如何确定合并范围内的哪些单元格可见并且可以有值?
【发布时间】:2019-03-06 10:16:35
【问题描述】:

我需要找出Range 中的哪些Cells 在合并的范围内不可见。我需要包含空单元格,但我想排除由于合并单元格而不可见的单元格。 (合并区域中只有一个单元格、行、列可以包含非空值...?)。

我有以下代码:

    using (XLWorkbook wb = new XLWorkbook(ExcelFile.FullName))
    {
        foreach (IXLNamedRange r in wb.NamedRanges)
        {
                foreach (var c in r.Ranges.Cells())
                {
                    if (c.IsMerged() /*&& something*/)
                        continue;
                    /*Do processing of visible values*/

我需要从包含值的合并范围中获取可见单元格,如果值已填写,即不使用IsEmpty()。我可以确定范围是否已合并,但如何添加条件以仅包含可见单元格?它总是第一列/行吗? IsMerged() 在合并范围内的所有单元格上返回 true,而不仅仅是那些不可见且不能包含值的单元格。

示例问题:

命名范围的地址为 C21:D33。 我需要 C21:C33 的值,但我不需要包含 D21:D33 的值 - 它们始终为空。但是 C21:C33 的值也可以为 null 或为空,但我需要它们。 D21:D33 只能包含 null,但 C21:C33 可以包含非 null 值。我需要所有可以非空的单元格。

【问题讨论】:

  • 我很难准确理解您想要做什么。 cells that are not visible as a result of merging cells。这对我来说完全没有意义。合并不会改变单元格的可见性。隐藏列或行会更改ClosedXML 上下文中单元格的可见性。也许添加您的工作表的屏幕截图并确定您希望找到的单元格。
  • @FrancoisBotha 如果我合并 A1:B1 并在合并的单元格中写入“1”,则 A1 的值为 1,B1 将为空。我只需要为所有合并的单元格获取一个单元格。
  • 我在下面更新了我的答案。

标签: c# excel closedxml


【解决方案1】:

此代码查找单元格C21:C33

using (var wb = new XLWorkbook("test.xlsx"))
{
    var nr = wb.NamedRange("MyRange");
    foreach (var range in nr.Ranges)
    {
        var cellsToFind = range.Cells(c => c.MergedRange().FirstCell() == c);

        Console.WriteLine($"{cellsToFind.First().Address}:{cellsToFind.Last().Address}");
    }
}

【讨论】:

  • 谢谢,但问题是,包含合并单元格的范围可以包含多个具有值的单元格,例如。 G。整列。第一个代码 sn-p 将为我提供所有单元格的值,即使是“不可见”的合并单元格,否则将为空。但这会导致重复值,不是吗?
  • MergedRange() 为隐藏单元格返回 null。修改为.Cells(c => c.MergedRange()!=null && c.MergedRange().FirstCell() == c).
猜你喜欢
  • 1970-01-01
  • 2022-10-31
  • 2013-06-17
  • 2021-10-15
  • 2017-07-24
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2020-12-01
相关资源
最近更新 更多