it-roy-ru.com

Как получить диапазон занятых ячеек в листе Excel

Я использую C # для автоматизации файла Excel. Мне удалось получить рабочую книгу и листы, которые в ней содержатся .... Если, например, у меня в листе 1 два столбца и 5 строк. Я хотел получить диапазон для занятых ячеек как A1: B5. Я попробовал следующий код, но он не дал правильного результата . Столбцы # и строка # были намного больше, и ячейки также были пустыми. 

     Excel.Range xlRange = excelWorksheet.UsedRange;
     int col = xlRange.Columns.Count;
     int row = xlRange.Rows.Count;

Есть ли другой способ, которым я могу использовать, чтобы получить этот диапазон?

33
Sarah

У меня была очень похожая проблема, как у вас. Что на самом деле сработало, так это:

iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;

//These two lines do the magic.
xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();

iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;

ИМХО, что происходит, когда вы удаляете данные из Excel, он продолжает думать, что в этих ячейках есть данные, хотя они пустые. Когда я очистил форматы, он удаляет пустые ячейки и, следовательно, возвращает фактические значения.

54
Farhan
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);

«range» теперь будет занятым диапазоном ячеек

19
Zurb

Смотрите метод Range.SpecialCells. Например, чтобы получить ячейки с постоянными значениями или формулами, используйте:

_xlWorksheet.UsedRange.SpecialCells(
        Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants |
        Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas)
4
Joe Erickson

Единственный способ заставить его работать во ВСЕХ сценариях (кроме Защищенных листов) (основываясь на Ответе Фархама):

Поддерживает:

  • Сканирование скрытых строк/столбцов

  • Игнорирует отформатированные ячейки без данных/формулы

Код:

// Unhide All Cells and clear formats
sheet.Columns.ClearFormats();
sheet.Rows.ClearFormats();

// Detect Last used Row - Ignore cells that contains formulas that result in blank values
int lastRowIgnoreFormulas = sheet.Cells.Find(
                "*",
                System.Reflection.Missing.Value,
                InteropExcel.XlFindLookIn.xlValues,
                InteropExcel.XlLookAt.xlWhole,
                InteropExcel.XlSearchOrder.xlByRows,
                InteropExcel.XlSearchDirection.xlPrevious,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value).Row;
// Detect Last Used Column  - Ignore cells that contains formulas that result in blank values
int lastColIgnoreFormulas = sheet.Cells.Find(
                "*",
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                InteropExcel.XlSearchOrder.xlByColumns,
                InteropExcel.XlSearchDirection.xlPrevious,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value).Column;

// Detect Last used Row / Column - Including cells that contains formulas that result in blank values
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count;
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count;
3
Gerhard Powell

Это приспособлено для поиска формул, но вы сможете расширить его до общего содержания, изменив способ тестирования начальных ячеек. Вам придется обрабатывать диапазоны одиночных ячеек за пределами этого.

    public static Range GetUsedPartOfRange(this Range range)
    {
        Excel.Range beginCell = range.Cells[1, 1];
        Excel.Range endCell = range.Cells[range.Rows.Count, range.Columns.Count];

        if (!beginCell.HasFormula)
        {
            var beginCellRow = range.Find(
                "*",
                beginCell,
                XlFindLookIn.xlFormulas,
                XlLookAt.xlPart,
                XlSearchOrder.xlByRows,
                XlSearchDirection.xlNext,
                false);

            var beginCellCol = range.Find(
                "*",
                beginCell,
                XlFindLookIn.xlFormulas,
                XlLookAt.xlPart,
                XlSearchOrder.xlByColumns,
                XlSearchDirection.xlNext,
                false);

            if (null == beginCellRow || null == beginCellCol)
                return null;

            beginCell = range.Worksheet.Cells[beginCellRow.Row, beginCellCol.Column];
        }

        if (!endCell.HasFormula)
        {
            var endCellRow = range.Find(
            "*",
            endCell,
            XlFindLookIn.xlFormulas,
            XlLookAt.xlPart,
            XlSearchOrder.xlByRows,         
            XlSearchDirection.xlPrevious,
            false);

            var endCellCol = range.Find(
                "*",
                endCell,
                XlFindLookIn.xlFormulas,
                XlLookAt.xlPart,
                XlSearchOrder.xlByColumns,
                XlSearchDirection.xlPrevious,
                false);

            if (null == endCellRow || null == endCellCol)
                return null;

            endCell = range.Worksheet.Cells[endCellRow.Row, endCellCol.Column];
        }

        if (null == endCell || null == beginCell)
            return null;

        Excel.Range finalRng = range.Worksheet.Range[beginCell, endCell];

        return finalRng;
    }
}
0
MikeJ
dim lastRow as long   'in VBA it's a long 
lastrow = wks.range("A65000").end(xlup).row
0
Patrick Honorez

Вам следует попробовать свойство currentRegion, если вы знаете, где найти диапазон. Это даст вам границы вашего используемого диапазона.

0
Utsav Jha

Эти две строки сами по себе не работали:

xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();

Вы можете проверить, нажав Ctrl + End на листе и увидев, какая ячейка выбрана. 

Я обнаружил, что добавление этой строки после первых двух решило проблему во всех случаях, с которыми я столкнулся:

Excel.Range xlActiveRange = WorkSheet.UsedRange;
0
Simon

Немного старый вопрос сейчас, но если кто-то ищет решение, это работает для меня.

using Excel = Microsoft.Office.Interop.Excel;

Excel.ApplicationClass Excel = new Excel.ApplicationClass();
Excel.Application app = Excel.Application;
Excel.Range all = app.get_Range("A1:H10", Type.Missing);
0
sidon