我有一张简单的Excel表格:
现在,我过滤它,使得单元格值> 1.现在我的数据如下:
现在,我选择了我需要的数据:
请注意,我已选择所有手机号码。
现在在我的代码中,我正在尝试检索所有选定的数据,如下所示:
Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
但是,它从开始到结束都给了我细胞。我认为excel也会选择不可见的行。因为还检索包含0的第4行。请看下面的图片:
所以,现在我创建了另一个Range并尝试添加可见的单元格的所有值,如下所示:
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);
}
现在,我在selection
变量中获得了4个项目。在onlyFilteredSelection
中有3个项目。
现在,我遇到了另一个麻烦:
以前,我得到了一个Range,因此我使用下面提到的代码非常容易地将它转换为逗号分隔字符串:
string[] AllRecepientMobileNumberValues = ((Array)(selection.Cells.Value2)).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);
但现在,我得到了一份清单。所以,现在我的一个大问题是如何将列表转换为逗号分隔的字符串?????????
答案 0 :(得分:2)
您可以再使用一个Select
从列表中获取值。
string[] AllRecepientMobileNumberValues = onlyFilteredSelection.Select(x => x.Cells.Value2).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);
答案 1 :(得分:0)
我试了一下,也遇到了问题。但我想我可能已经为您的情况找到了可能的解决方法。首先是我发现的一些事情。
我创建了宏到记录在您的selection'too的复制操作中生成的 VBA 代码。奇怪的是,您可以看到代码中没有任何特殊内容。
vba宏代码
Range("A3:A5").Select ' correct as three lines are selected,
' but only two of them have a rowHeight > 0
Selection.Copy
Range("F8").Select
ActiveSheet.Paste ' and here is the magic?? why does vba only paste 2 cells??
所以我决定提出一个解决方法。为什么不模拟VBA看起来也是如此呢?仅处理rowHeight > 0
。
<强> exampleCode.cs 强>
private static void readFilteredCells()
{
Excel.Application xlApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
Workbook xlBook = (Excel.Workbook)xlApp.ActiveWorkbook;
Worksheet wrkSheet = xlBook.Worksheets[1];
Range selection = xlApp.Selection;
for (int rowIndex = selection.Row; rowIndex < selection.Row + selection.Rows.Count; rowIndex++)
{
if (wrkSheet.Rows[rowIndex].EntireRow.Height!=0)
{
// do something special
}
}
}
我希望我的答案对你有用。如果您需要任何进一步的帮助,请告诉我。