C#的Excel:正确的方式来获得的行和列数

问题描述:

我有问题,C#互操作的Excel得到有效范围大文件C#的Excel:正确的方式来获得的行和列数

https://www.dropbox.com/s/betci638b1faw8g/Demo%20Training%20Data.xlsx?dl=0

这是我的文件,但实际规模是1000,但我得到了49998

我使用的标准代码

Excel.Application xlApp = new Excel.Application(); 
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(txtbTrainPath.Text); 
Excel.Worksheet xlWorksheet = xlWorkbook.Worksheets[1]; 
Excel.Range xlRange = xlWorksheet.UsedRange;    
xlApp.Visible = true; 
xlWorksheet.Columns[5].Delete(); 
xlWorksheet.Columns[3].Delete();    
rowCount = xlRange.Rows.Count; 
colCount = xlRange.Columns.Count; 

仅适用于该文件无法正常工作,其他文件效果很好。请帮我找出问题所在。如何仅调整有效大小的工作表。

+0

这听起来像使用范围可能返回拥有或者某些格式,或者说是不可见的数据单元。即使单元格包含NO数据,使用的范围仍会返回单元格中包含ANY格式的单元格。 – JohnG

我会使用这种方法来获取行和列计数,它将返回非空单元格的结果。

// Find the last real row 
lastUsedRow = worksheet.Cells.Find("*",System.Reflection.Missing.Value, 
           System.Reflection.Missing.Value, System.Reflection.Missing.Value, 
           Excel.XlSearchOrder.xlByRows,Excel.XlSearchDirection.xlPrevious, 
           false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Row; 

// Find the last real column 
lastUsedColumn = worksheet.Cells.Find("*", System.Reflection.Missing.Value, 
           System.Reflection.Missing.Value,System.Reflection.Missing.Value, 
           Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlPrevious, 
           false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Column; 

这是给你参考的完整代码:

using Excel = Microsoft.Office.Interop.Excel; 

Excel.Application xlApp  = null; 
Excel.Workbook wb   = null; 
Excel.Worksheet worksheet = null; 
int lastUsedRow    = 0; 
int lastUsedColumn   = 0; 
string srcFile    = @"Path to your XLSX file"; 

xlApp = new Excel.ApplicationClass(); 
xlApp.Visible = false; 
wb = xlApp.Workbooks.Open(srcFile, 
           0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", 
           true, false, 0, true, false, false); 

worksheet = (Excel.Worksheet)wb.Worksheets[1]; 
Excel.Range range 

// Find the last real row 
lastUsedRow = worksheet.Cells.Find("*",System.Reflection.Missing.Value, 
           System.Reflection.Missing.Value, System.Reflection.Missing.Value, 
           Excel.XlSearchOrder.xlByRows,Excel.XlSearchDirection.xlPrevious, 
           false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Row; 

// Find the last real column 
lastUsedColumn = worksheet.Cells.Find("*", System.Reflection.Missing.Value, 
           System.Reflection.Missing.Value,System.Reflection.Missing.Value, 
           Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlPrevious, 
           false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Column; 

xlApp.Workbooks.Close(); 
xlApp.Quit(); 

Marshal.ReleaseComObject(worksheet); 
Marshal.ReleaseComObject(wb); 
Marshal.ReleaseComObject(xlApp); 

下载好excel文件并查看后,我发现正如我所料,在第49998行C列格式化。字体不同,数字格式不同,字体颜色为红色。我简单地删除了第49998行的所有单元格,并且这只是将已使用的范围行的数目减少到49997.您可以通过删除最后一行来播放此猜测单元格的格式,然后再次检查。我有一种感觉,49998行以上的所有单元格都有一些不同的格式。

修复这一张表以获得正确的使用范围。你有两个选择。 1)选择从1001行开始的WHOLE行,然后向下滚动到49998行。按住SHIFT键,单击WHOLE行49998.选择行1001到49998,右键单击选择并选择“Delete” ,如果它询问,则将单元格向上移动。或2)仅用数据复制单元格并将单元格粘贴到新工作表中,删除旧工作表并将新工作表重命名为以前的工作表名称。我希望这是有道理的。

+0

我试图删除行1001到49998,但它不能删除。我如何删除行? –

+0

右键单击选择并选择“删除”...或从“主页选项卡”的“单元格”功能区中选择“删除” – JohnG

+0

现在我已经试过这是程序化..我如何在互操作中选择多行。我将使用Range.ClearFormats。清除范围[1001:49998] .delete或clearFormats。我找到了...请帮助我 –