如何在excel表中获取被占用单元格的范围

时间:2009-08-16 14:10:26

标签: c# excel automation

我使用C#自动化excel文件。我能够获得它包含的工作簿和工作表。 例如,我在sheet1中有两个cols和5行。我希望o获得被占用单元格的范围为A1:B5。我尝试了以下代码,但没有给出正确的结果。 列#和行#更大,单元格也是空的。

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

我可以使用另一种方法来获得该范围吗?

10 个答案:

答案 0 :(得分:55)

我遇到了一个非常类似的问题。实际工作的是:

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中删除数据时,它会继续认为这些单元格中有数据,尽管它们是空白的。当我清除格式时,它会删除空白单元格,从而返回实际计数。

答案 1 :(得分:19)

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

“range”现在将是占用的细胞范围

答案 2 :(得分:4)

请参阅Range.SpecialCells方法。例如,要获取具有常量值或公式的单元格,请使用:

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

答案 3 :(得分:3)

我可以让它在所有场景中工作的唯一方法(受保护的工作表除外)(基于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;

答案 4 :(得分:0)

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

答案 5 :(得分:0)

现在有点老问题,但如果有人在寻找解决方案,这对我有用。

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

答案 6 :(得分:0)

这两条线本身并不适合我:

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

您可以通过在工作表中按ctrl + end并查看选择了哪个单元格进行测试。

我发现在前两个之后添加这一行解决了我遇到的所有情况中的问题:

Excel.Range xlActiveRange = WorkSheet.UsedRange;

答案 7 :(得分:0)

如果你知道从哪里找到范围,你应该尝试currentRegion属性。这将为您提供所用范围的边界。

答案 8 :(得分:0)

这是专门为查找公式而设计的,但是您应该能够通过更改测试起始单元格的方式将其扩展为常规内容。您必须处理超出此范围的单个单元格范围。

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

答案 9 :(得分:0)

您不应该通过按“删除”来删除框中的数据,我认为这是问题所在,因为excel仍会检测到该框为“” <-仍然有值,您应该通过右键单击该框并单击删除来删除