如何从过滤的细胞从Excel
只得到所选单元格的值我有一个简单的Excel工作表:如何从过滤的细胞从Excel
现在,我将其过滤,使得单元格值> 1。现在我的数据是这样的:
现在,我选择我需要的数据:
请注意,我选择了所有移动号码。
现在在我的代码,我试图找回所有选定的数据如下:
Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
但是,它给了我从开始到结束的细胞。我认为excel也选择不可见的行。因为包含0的第4行也被检索。看看下面的图片:
所以,现在我创造了另一个范围,并试图以如下补充说,可见细胞中的所有值:
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项。现在
,我在另一个麻烦:
以前,我得到一个范围,所以我把它转换成一个逗号分隔的字符串非常容易使用下面提到代码:
string[] AllRecepientMobileNumberValues = ((Array)(selection.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);
我试了一下,也有问题。但我想我可能已经找到了适合您情况的可能的解决方法。首先我发现了一些事情。
- 我能够重现你的行为
- 所有可见单元格的选择失败,因为一个过滤器(似乎?)不要隐藏行,但该行高度设置为0!
- 在环视Application Member或Range Member时,我找不到任何其他有用的方法/属性。
我创建了一个宏到将是对你的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
}
}
}
我希望我的回答是任何对你有用。如果您需要任何进一步的帮助,请让我知道。
是的,你的答案是有用的,但我可以说你的假设是错误的。要查看该问题,请检查问题的更新部分。如果可以的话,请在问题更新部分尝试回答另一个问题。并感谢您的努力........ – Vishal 2015-02-24 21:58:30
Thx分享您的解决方案!很高兴你能解决你的问题。 – 2015-02-25 07:30:14
就是这样。它工作得很好。我非常紧张,我甚至没有意识到选择条款。感谢您回答。 – Vishal 2015-02-24 22:40:27