C# 如何从excel中筛选的单元格中仅获取选定单元格值

C# 如何从excel中筛选的单元格中仅获取选定单元格值,c#,import-from-excel,C#,Import From Excel,我有一个简单的excel表格: 现在,我过滤它,使单元格值>1。现在,我的数据如下所示: 现在,我选择我需要的数据: 请注意,我已选择了所有手机号码 现在,在我的代码中,我尝试检索所有选定的数据,如下所示: Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection; Range onlyFilteredSelection = selection.Cells.SpecialCells(XlCellT

我有一个简单的excel表格:

现在,我过滤它,使单元格值>1。现在,我的数据如下所示:

现在,我选择我需要的数据:

请注意,我已选择了所有手机号码

现在,在我的代码中,我尝试检索所有选定的数据,如下所示:

Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
Range onlyFilteredSelection = selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible);
但是,它给了我从开始到结束的细胞。我认为excel也会选择不可见的行。因为也会检索包含0的第4行。请看下图:

因此,现在我创建了另一个范围,并尝试添加所有可见单元格的值,如下所示:

Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
Range onlyFilteredSelection = selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible);
现在,我可以看到c只显示了两行。为什么不显示最后一行,即非筛选行之后的行。看看这里的值:

更新:

在发布了这个问题之后,我有一个想法,我可能会得到多个范围而不是1,因此,我开始探索。看看我发现了什么。我发现我完全正确。我有多个射程

以下是我尝试过的代码:

Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;

List<Range> onlyFilteredSelection = new List<Range>();

foreach (Range range in selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible))
{
    onlyFilteredSelection.Add(range);
}

但现在,我得到了一份清单。所以,现在我的大问题是如何将列表转换为逗号分隔的字符串?????

我尝试了一下,也遇到了一些问题。但我想我可能已经为你的情况找到了一个可能的解决办法。首先我发现了一些事情

我能模仿你的行为 所有可见单元格的选择都失败,因为过滤器似乎?不隐藏行,但将行高度设置为0! 在或上查找时,我找不到任何其他有用的方法/属性。 我创建了一个宏来记录在您选择的复制操作中生成的VBA代码。奇怪的是,正如您所看到的,代码中并没有什么特殊之处

vba宏代码

所以我决定想出一个解决办法。为什么不模拟VBA似乎也在做的事情呢。仅处理行高>0的单元格

exampleCode.cs

我希望我的回答对你有用。如果您需要任何进一步的帮助,请告诉我。

您可以使用另一个选择从列表中获取值

string[] AllRecepientMobileNumberValues = onlyFilteredSelection.Select(x => x.Cells.Value2).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);

是的,你的回答当然有用,但我可以说你的假设是错误的。要了解这一点,请检查问题的更新部分。如果可以,请尝试回答问题更新部分的另一个问题。感谢您的努力……谢谢您分享您的解决方案!很高兴你能解决你的问题,就这样。它很好用。我非常紧张,甚至没有意识到select子句。谢谢你的回答。
string[] AllRecepientMobileNumberValues = onlyFilteredSelection.Select(x => x.Cells.Value2).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);