如何获得在Excel工作表中占用的单元格范围(How to get the range of occ

2019-06-18 12:19发布

我使用C#自动化Excel文件。 我能得到的工作簿和它所包含的表。 举例来说,如果我有在Sheet1 2周的cols和5行。 我想Ø得到了占用的单元格为A1的范围:B5。 我试着下面的代码,但它没有给出正确的结果。 列#和行号是更大和细胞空为好。

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

有另一种方式我可以用它来获取范围内?

Answer 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中删除数据时,它不断在想,有这些单元格中的数据,尽管它们是空白。 当我清除格式,它消除了空白单元格,因此返回实际计数。



Answer 2:

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

“范围”现在是占据单元格区域



Answer 3:

见Range.SpecialCells方法。 例如,为了获得具有恒定值或公式中使用的细胞:

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


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


Answer 5:

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


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


Answer 7:

这两条线路上自己wasnt为我工作:

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

可以通过按下ctrl +端在片材,看到被选择哪个小区测试。

我发现,加入这一行后的头两个在我遇到的所有情况下,解决了这个问题:

Excel.Range xlActiveRange = WorkSheet.UsedRange;


Answer 8:

你应该尝试的currentRegion属性,如果你从你在哪里找到的范围内知道。 这会给你的使用范围的边界。



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


Answer 10:

你不应该按“删除”,我认为是问题,因为Excel仍然会检测箱为“”框删除数据< - 仍然有值,U应删除右键单击该框,然后点击删除。



文章来源: How to get the range of occupied cells in excel sheet