Я использую Microsoft. Office. Interop. Excel, и я не могу найти способ возвратить выбранные строки. То, под чем я подразумеваю "выбранный", сами номера строк, когда Вы нажимаете на поле строки слева и выбираете одну или несколько непрерывных или строк, состоящих из нескольких несмежных участков (который выделяет целую строку.) Это отличается от выбора региона или области на самом листе.
До сих пор я посмотрел на приложение. Выбор, приложение. Ячейки, приложение. Строки, и ни один из них, кажется, не дает мне строки. приложение. Выбор дает мне фактическое содержание ячейки, которое НЕ является тем, что я хочу.
Какие-либо идеи?Спасибо!
Для этого необходимо перечислить каждую область в диапазоне, а затем перечислять строки в каждой области. Несколько смущает, свойство Excel.range.rows возвращает коллекцию диапазонов (каждый представляющий строку), а свойство Excel.range.row возвращает номер строки левая клетка в диапазоне.
Следовательно, чтобы получить номера строк, вы должны перечислить области и коллекции строк, а затем получить доступ к дальности. Например:
Excel.Range range = (Excel.Range)excelApp.Selection;
List<int> rowNumbers = new List<int>();
// Enumerate the Rows within each Area of the Range.
foreach (Excel.Range area in range.Areas)
{
foreach (Excel.Range row in area.Rows)
{
rowNumbers.Add(row.Row);
}
}
// Report the results.
foreach (int rowNumber in rowNumbers)
{
MessageBox.Show(rowNumber.ToString());
}
Вы можете даже использовать LINQ, если хотите.
Использование синтаксиса запросов:
IEnumerable<int> rowNumbers =
from area in range.Areas.Cast<Excel.Range>()
from row in area.Rows.Cast<Excel.Range>()
select row.Row;
Использование синтаксиса метода:
IEnumerable<int> rowNumbers =
range.Areas.Cast<Excel.Range>()
.SelectMany(area => area.Rows.Cast<Excel.Range>()
.Select(row => row.Row));
Обновление: Как вернуться Отчетливые номера рядные номера:
для возврата различных номеров строк (которые могут возникнуть при многоместном диапазоне выбран, где область не содержат целых строк).
(1) Самый простой является использование LINQ и использовать различные Оператор . Например:
Использование синтаксиса запроса:
IEnumerable<int> distinctRowNumbers =
(from area in range.Areas.Cast<Excel.Range>()
from row in area.Rows.Cast<Excel.Range>()
select row.Row)
.Distinct();
с использованием синтаксиса метода:
IEnumerable<int> distinctRowNumbers =
range.Areas.Cast<Excel.Range>()
.SelectMany(area => area.Rows.Cast<Excel.Range>()
.Select(row => row.Row))
.Distinct();
(2) Если не использовать LINQ, то вы можете использовать HashSet . Например:
Excel.Range range = (Excel.Range)excelApp.Selection;
HashSet<int> distinctRowNumbers = new HashSet<int>();
// Enumerate the Rows within each Area of the Range.
foreach (Excel.Range area in range.Areas)
{
foreach (Excel.Range row in area.Rows)
{
distinctRowNumbers.Add(row.Row);
}
}
// Report the results.
foreach (int rowNumber in distinctRowNumbers)
{
MessageBox.Show(rowNumber.ToString());
}
(3) Возможно, наиболее интуитивно понятный подход - сначала преобразовать ваш исходный диапазон на целые ряды, а затем повторять строки. В этом случае строки уже гарантированы уникальными, поэтому нам не нужно использовать HASHSET или Оператор .
В этих примерах обратите внимание на использование Excel.range.entirerow , который применяется к исходному диапазону перед перечислением областей и строк:
Перечисление без использования LINQ:
List<int> distinctRowNumbers = new List<int>();
foreach (Excel.Range area in range.EntireRow.Areas)
{
foreach (Excel.Range row in area.Rows)
{
distinctRowNumbers.Add(row.Row);
}
}
LINQ с помощью запроса Синтаксис:
IEnumerable<int> distinctRowNumbers =
from area in range.EntireRow.Areas.Cast<Excel.Range>()
from row in area.Rows.Cast<Excel.Range>()
select row.Row;
LINQ с использованием синтаксиса метода:
IEnumerable<int> distinctRowNumbers =
range.EntireRow.Areas.Cast<Excel.Range>()
.SelectMany(area => area.Rows.Cast<Excel.Range>()
.Select(row => row.Row));
Обратите внимание, что диапазон может вернуть неверный результат , но, если я понимаю это правильно, это только относится к Excel '95 и ниже, что полностью устарел. (Я бы не беспокоился о какой-либо версии Excel ниже Excel '97.) Если вы беспокоитесь о любых вопросах версий, однако, и не имеете роскоши тестирования во всех версиях Excel, тогда вы можете придерживаться использования HashSet или используйте LINQ вместе с отдельным оператором, чтобы убедиться, что ваши строки уникальны.
Надеюсь, это поможет!
Майк