C# 如何确定合并区域中哪些单元格可见且可以有值?

C# 如何确定合并区域中哪些单元格可见且可以有值?,c#,excel,closedxml,C#,Excel,Closedxml,我需要找出范围中哪些单元格在合并的范围中不可见。我需要包括空单元格,但我想排除由于合并单元格而不可见的单元格。(合并范围中只有一个单元格、行、列可以包含非空值…?) 我有以下代码: using (XLWorkbook wb = new XLWorkbook(ExcelFile.FullName)) { foreach (IXLNamedRange r in wb.NamedRanges) { foreach (var

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

我有以下代码:

    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值。我需要所有非空单元格。

此代码查找单元格
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}");
    }
}

我正努力理解你到底想做什么<代码>由于合并单元格而不可见的单元格。这对我来说没什么意义。合并不会更改单元格的可见性。隐藏列或行会更改
ClosedXML
上下文中单元格的可见性。也许可以添加工作表的屏幕截图,并确定您希望找到的单元格。@FrancoisBotha如果我合并A1:B1并在合并的单元格中写入“1”,A1的值将为1,B1将为空。我只需要为所有合并单元格获取一个单元格。我更新了下面的答案。谢谢,但问题是,包含合并单元格的区域可以包含多个具有值的单元格,例如。G整列。第一个代码段将为所有单元格(即使是“不可见”的合并单元格)提供值,否则该值将为空。但这会导致重复的值,不是吗?
MergedRange()
为隐藏单元格返回null。修改为
.Cells(c=>c.MergedRange()!=null&&c.MergedRange().FirstCell()==c)