programing

Excel 시트에서 점유된 셀의 범위를 가져오는 방법

stoneblock 2023. 4. 29. 08:14

Excel 시트에서 점유된 셀의 범위를 가져오는 방법

저는 C#을 사용하여 엑셀 파일을 자동화합니다.저는 워크북과 그 안에 들어 있는 시트를 가져올 수 있었습니다.예를 들어 시트1에 2개의 콜과 5개의 행이 있다고 가정합니다.저는 점유된 셀의 범위를 A1:B5로 얻고 싶었습니다.다음 코드를 시도해 보았지만 정확한 결과가 나오지 않았습니다.#열과 #행은 훨씬 더 컸고 셀도 비어 있었습니다.

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

제가 그 범위를 얻기 위해 사용할 수 있는 다른 방법이 있나요?

저도 당신과 매우 비슷한 문제가 있었습니다.실제로 효과가 있었던 것은 다음과 같습니다.

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;

IMHO에서 발생하는 일은 엑셀에서 데이터를 삭제할 때, 셀이 비어 있더라도 셀에 데이터가 있다고 계속 생각하는 것입니다.포맷을 지우면 빈 셀이 제거되어 실제 카운트가 반환됩니다.

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

이제 "range"가 점유된 셀 범위가 됩니다.

범위를 참조하십시오.특수 셀 메서드입니다.예를 들어, 상수 값 또는 공식을 가진 셀을 가져오려면 다음을 사용합니다.

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

모든 시나리오(보호 시트 제외)에서 작동할 수 있는 유일한 방법(Farham's Answer 기준):

다음을 지원합니다.

  • 숨겨진 행/열 검색

  • 데이터/공식이 없는 포맷된 셀을 무시합니다.

코드:

// 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;
dim lastRow as long   'in VBA it's a long 
lastrow = wks.range("A65000").end(xlup).row

지금은 좀 오래된 질문이지만, 누군가가 해결책을 찾고 있다면 이것은 저에게 효과가 있습니다.

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

이 두 대사는 제게 효과가 없었습니다.

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

시트에서 ctrl+end를 누르고 선택한 셀을 확인하여 테스트할 수 있습니다.

처음 두 줄 뒤에 이 줄을 추가하면 모든 사례에서 문제가 해결되었습니다.

Excel.Range xlActiveRange = WorkSheet.UsedRange;

범위를 찾을 위치를 알고 있는 경우 현재 지역 속성을 사용해 보십시오.사용한 범위의 경계가 표시됩니다.

이것은 공식을 찾는 데 적합하지만 시작 셀을 테스트하는 방법을 변경하여 일반 내용으로 확장할 수 있어야 합니다.이 외의 단일 셀 범위를 처리해야 합니다.

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

당신은 "삭제"를 눌러 박스 안의 데이터를 삭제해서는 안 됩니다. 문제는 엑셀이 여전히 박스를 "<- 아직 값이 있습니다. 당신은 박스를 오른쪽 클릭하고 삭제를 클릭해야 합니다.

언급URL : https://stackoverflow.com/questions/1284388/how-to-get-the-range-of-occupied-cells-in-excel-sheet