Я пытаюсь считать файл Excel из C# с помощью COM и мог открыть его и загруженный очень хорошо. Однако я не хочу использовать все данные по листу (он расширяется ежемесячно), просто определенное подмножество, которое запускается ниже вершины листа (строка 3 для заголовков, строка 4 для данных) и идет в конец. Я могу в настоящее время получать диапазон, представляющий весь набор данных как Excel.Worksheet.UsedRange
, но затем я должен или управлять этим вниз к желаемому диапазону или (предпочтительно) найти, что конечная точка передает в другой диапазон для моего фактического поиска данных. Кто-либо может сказать мне, как сделать любой из них?Спасибо.
Я не уверен, что вы пытаетесь сделать. Но вот несколько примеров.
Предположим, у меня есть следующий диапазон:
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();
У вас должна быть возможность использовать 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.
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", что дает мне именно то, что я хочу, и я могу затем создать новый диапазон, извлекая вторую часть, а затем продолжить.
Из MSDN :
"Используйте свойство End вместе со значением из перечисления XlDirection (xlUp, xlToRight, xlToLeft, xlDown), чтобы получить диапазон, представляющий ячейку в конце области, как если бы вы нажали клавишу, описанную перечисляемым значением; "
rngDown = rng.get_End(Excel.XlDirection.xlDown);