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

Sar*_*rah 35 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;
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以用来获得该范围?

Far*_*han 59

我有一个非常类似的问题.实际工作的是:

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;
Run Code Online (Sandbox Code Playgroud)

恕我直言,当你从Excel中删除数据时,它会继续认为这些单元格中有数据,尽管它们是空白的.当我清除格式时,它会删除空白单元格,从而返回实际计数.

  • 啊,哎呀.是的,这确实有效(之前,Excel报告我有16,349列,而不仅仅是13!)但是 - 显而易见 - 它删除了所有单元格格式.反正有没有这样做才能得到"真正的"列数...? (4认同)
  • 这是我见过的唯一没有问题的答案.这解决了以下问题:检测空格式化单元格.检测隐藏行/列中的值. (3认同)
  • 这是一个非常有用的答案,但请注意,这需要对电子表格进行写访问. (3认同)
  • xlWorkSheet.Columns.ClearFormats(); xlWorkSheet.Rows.ClearFormats(); 很好的答案 (2认同)
  • 好的解决方案。但这个解决方案的缺点是,我通过艰难的方式发现,如果您需要读取 Excel 中显示的值,那么通过清除所有格式您将无法做到这一点。我在解决这个问题时发现了这个:http://stackoverflow.com/questions/39931543/c-sharp-excel-date-value-is-coming-as-numeric-value (2认同)

Zur*_*urb 19

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

"范围"现在将是占用的细胞范围


Joe*_*son 4

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

_xlWorksheet.UsedRange.SpecialCells(
        Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants |
        Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas)
Run Code Online (Sandbox Code Playgroud)

  • (六年了,后来两次痛苦的 Excel 迭代...)这似乎正是我所需要的,但是对于 Excel 2013,它会抛出“Range 类的 SpecialCells 方法失败”异常...使用“Cells.SpecialCells(XlCellType) .xlCellTypeLastCell)" 工作正常...但有时会返回一个无可救药的错误答案(例如包含 9 列数据的工作表中的第 16,349 列...) (3认同)