2015-02-24 2 views
1

У меня есть простой первенствовать лист:Как только получить выбранное значение ячеек из отфильтрованных ячеек из Excel

enter image description here

Теперь я фильтровать таким образом, что значение ячейки> 1. Теперь мои данные выглядит следующим образом:

enter image description here

Теперь я выбираю те данные, которые я требую:

enter image description here

Обратите внимание, что я выбрал все мобильные номера.

Сейчас в моем коде, я пытаюсь получить все выбранные данные следующим образом:

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

Но это дает мне клетки от запуска до конца. Я думаю, что excel также выбирает невидимые строки. Потому что строка 4, содержащая 0, также извлекается. Посмотрите на изображение ниже:

enter image description here

Итак, теперь я создал еще один диапазон и попытался добавить все значения ячеек, которые видны следующим образом:

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

Теперь я могу видеть, что C# показывает мне только две строки. Почему она не отображает последнюю строку, которая находится после строки без фильтрации. Посмотрите на значения здесь:

enter image description here

Update:

После публикации этого вопроса, я получил мысль в моей голове, что я мог бы получать несколько диапазонов вместо 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); 
} 

Теперь я получаю 4 пунктов в selection переменной. А в onlyFilteredSelection есть 3 предмета.

Сейчас я нахожусь в другой неприятности:

Раньше я получал диапазон, поэтому я преобразовал его в строку, разделенную запятыми очень легко, используя нижеуказанным код:

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

Но теперь я получаю Список. Итак, теперь мой большой вопрос заключается в том, как преобразовать список в разделяемую запятыми строку ?????????

ответ

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); 
+0

Вот и все. Он работает отлично. Я был очень напряжен, что даже не понял предложение select. Спасибо, что ответили на него. – Vishal

0

Я пробовал немного и тоже имел проблемы. Но я думаю, что я нашел возможное обходное решение для вашей ситуации. Сначала я кое-что узнал.

  • Я был в состоянии воспроизвести ваше поведение
  • выбора всех видимых ячеек не удается, так как фильтр (кажется?) Не скрывать строки, но установить высоту строки в 0!
  • Я не нашел другого полезного метода/свойства при просмотре на Application Member или Range Member.

Я создал макрос в запись, что VBA код будет генерироваться на копии действия Вашего selection'too. Странно то, что в коде нет ничего особенного, как вы можете видеть.

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 
     } 
    } 
} 

Я надеюсь, что мой ответ никакой пользы для вас. Если вам нужна дополнительная помощь, пожалуйста, дайте мне знать.

+0

Да, ваш ответ является полезным, но я могу сказать, что ваши предположения были неправильными. Чтобы увидеть это, пожалуйста, проверьте часть обновления вопроса. И если вы затем можете попробовать ответить на другой вопрос в разделе «Обновление». И спасибо за ваши усилия ........ – Vishal

+0

Thx для обмена вашими решениями! Рад, что вы смогли решить свою проблему. –

Смежные вопросы