Должен найти начальные и конечные точки Excel Range в C#

Я пытаюсь считать файл Excel из C# с помощью COM и мог открыть его и загруженный очень хорошо. Однако я не хочу использовать все данные по листу (он расширяется ежемесячно), просто определенное подмножество, которое запускается ниже вершины листа (строка 3 для заголовков, строка 4 для данных) и идет в конец. Я могу в настоящее время получать диапазон, представляющий весь набор данных как Excel.Worksheet.UsedRange, но затем я должен или управлять этим вниз к желаемому диапазону или (предпочтительно) найти, что конечная точка передает в другой диапазон для моего фактического поиска данных. Кто-либо может сказать мне, как сделать любой из них?Спасибо.

6
задан Tom A 18 February 2010 в 17:58
поделиться

4 ответа

Я не уверен, что вы пытаетесь сделать. Но вот несколько примеров.

Предположим, у меня есть следующий диапазон:

Excel.Worksheet sheet = this.Application.ActiveSheet as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", "B5") as Excel.Range;

Чтобы переместить диапазон вниз на n -число строки:

int n = 1;
int rows = range.Rows.Count;
int cols = range.Columns.Count;

Excel.Range newRange = range.get_Offset(n, 0).get_Resize(rows-n,cols);
newRange.Select(); //will select the new range will be 1 row lower

Чтобы переместить нижнюю строку вверх

Excel.Range newRange = range.get_Resize(rows-n,cols);
newRange.Select(); //will select the new range will be 1 row higher

Я полагаю, вы можете понять, как чтобы переместить его из стороны в сторону.

get_Offset () переместит весь диапазон, а затем вам нужно будет изменить размер диапазона.

РЕДАКТИРОВАТЬ: Теперь, когда я знаю, чего вы хотите.

Чтобы выбрать последнюю ячейку:

Excel.Range lastCell = range.Cells[rows, cols] as Excel.Range;
lastCell.Select();

Теперь вы можете использовать свою собственную начальную точку, например, так:

Excel.Range newRange = sheet.get_Range("B1", lastCell);
newRange.Select();
7
ответ дан 9 December 2019 в 22:33
поделиться

У вас должна быть возможность использовать Range.Row , Range.Rows.Count , Range.Column и Range.Columns. Подсчитайте свойства , чтобы получить начало и конец диапазона, например:

Dim used As Range, first As Range, last As Range
Set used = Sheet1.UsedRange
Set first = Sheet1.Cells(used.Row, used.Column)
Set last = Sheet1.Cells(used.Row + used.Rows.Count, used.Column + used.Columns.Count)

MsgBox ("First: " + first.Address + " Last: " + last.Address)

Этот пример кода находится в VBA, но все эти функции должны быть доступны в C # с COM.

1
ответ дан 9 December 2019 в 22:33
поделиться

Ok, нашел ответ (после почти 3 часов общего поиска, спросил здесь через 2 часа), поэтому опубликую здесь для других.

Excel.Range urange = (Excel.Range)xlWorkSheet.UsedRange; // дает нам фактический диапазон
string used = urange.get_Address(false, false, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing)))

Из MSDN:
public string get_Address (
[OptionalAttribute] Object RowAbsolute,
[OptionalAttribute] Object ColumnAbsolute,
[OptionalAttribute] XlReferenceStyle ReferenceStyle,
[OptionalAttribute] Object External,
[OptionalAttribute] Object RelativeTo
)

где, очевидно, первые два являются флагами true/false, следующий определяется как объект Microsoft.Office.Interop.Excel.XlReferenceStyle, и я предполагаю, что External - это либо ссылка на внешний файл, либо какой-то флаг. RelativeTo, я могу только догадываться, что он ссылается на произвольно определенную позицию, возможно, объект диапазона, возможно, строка. К сожалению, MSDN крайне скуден на эту тему, поэтому я просто гадаю и публикую свои предположения. Однако, используя этот код, как я уже писал, я могу извлечь общее число, используемое как "A1:B245", что дает мне именно то, что я хочу, и я могу затем создать новый диапазон, извлекая вторую часть, а затем продолжить.

2
ответ дан 9 December 2019 в 22:33
поделиться

Из MSDN :

"Используйте свойство End вместе со значением из перечисления XlDirection (xlUp, xlToRight, xlToLeft, xlDown), чтобы получить диапазон, представляющий ячейку в конце области, как если бы вы нажали клавишу, описанную перечисляемым значением; "

rngDown = rng.get_End(Excel.XlDirection.xlDown);
1
ответ дан 9 December 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: