Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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, он продолжает думать, что в этих ячейках есть данные, хотя они пусты. Когда я очищаю форматы, он удаляет пустые ячейки и, следовательно, возвращает фактические значения.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Он поддерживает:

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

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

код:

// 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;

Ответ 5

dim lastRow as long   'in VBA it a long 
lastrow = wks.range("A65000").end(xlup).row

Ответ 6

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

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

Ответ 7

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

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

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

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

Excel.Range xlActiveRange = WorkSheet.UsedRange;

Ответ 8

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

Ответ 9

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

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

Ответ 10

Вы не должны удалять данные в окне, нажав "удалить", я думаю, в этом проблема, потому что Excel все равно обнаружит поле как "" <- все еще имеет значение, вы должны удалить его, щелкнув правой кнопкой мыши на поле и нажав "Удалить".