如何仅从excel中过滤的单元格中获取选定的单元格值

时间:2015-02-24 20:30:38

标签: c# import-from-excel

我有一张简单的Excel表格:

enter image description here

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

enter image description here

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

enter image description here

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

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

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

但是,它从开始到结束都给了我细胞。我认为excel也会选择不可见的行。因为还检索包含0的第4行。请看下面的图片:

enter image description here

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

Range onlyFilteredSelection = selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible);

现在,我可以看到c#只显示了两行。为什么不显示最后一行,即在未过滤的行之后。看看这里的值:

enter image description here

更新

在发布这个问题之后,我想到了我可能会得到多个范围而不是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);            

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

2 个答案:

答案 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)

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

  • 我能够重现你的行为
  • 所有可见单元格的选择都失败了,因为过滤器(好像?)不是要隐藏行,而是将行高设置为0!
  • 在查看Application MemberRange 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
        }
    }
}

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