C# Excel:获取行数和列数的正确方法
C# Excel : Correct way to get Rows and Columns count
我在使用 C# Interop 时遇到问题 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;
只有这个文件不能正常使用,其他文件都可以正常使用。请帮我找出问题所在。如何将工作表调整为仅有效大小。
下载excel文件查看后,果然如我所料,第49998行C列格式化,字体不一样,数字格式不一样,字体颜色是红色.我只是删除了第 49998 行的所有单元格,这只是将使用的范围行数减少到 49997。您可以通过删除最后一行来猜测哪些单元格具有格式,然后再次检查。我感觉第 49998 行以上的所有单元格都有某种不同的格式。
修复这个 sheet 以获得正确的使用范围。你有两个选择。 1) Select 从第 1001 行开始的整行,然后向下滚动到第 49998 行。按住 SHIFT 键,单击第 49998 行。从第 1001 行到 49998 selected,右键单击selection 和 select "Delete" 并且可能,如果它要求,将单元格向上移动。或 2) 复制仅包含数据的单元格并将单元格粘贴到新作品sheet中,删除旧作品sheet并将新作品sheet重命名为之前的作品sheet ] 姓名。我希望这是有道理的。
我会使用这种方法来获取行数和列数,这将 return 非空单元格的结果。
// 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);
我在使用 C# Interop 时遇到问题 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;
只有这个文件不能正常使用,其他文件都可以正常使用。请帮我找出问题所在。如何将工作表调整为仅有效大小。
下载excel文件查看后,果然如我所料,第49998行C列格式化,字体不一样,数字格式不一样,字体颜色是红色.我只是删除了第 49998 行的所有单元格,这只是将使用的范围行数减少到 49997。您可以通过删除最后一行来猜测哪些单元格具有格式,然后再次检查。我感觉第 49998 行以上的所有单元格都有某种不同的格式。
修复这个 sheet 以获得正确的使用范围。你有两个选择。 1) Select 从第 1001 行开始的整行,然后向下滚动到第 49998 行。按住 SHIFT 键,单击第 49998 行。从第 1001 行到 49998 selected,右键单击selection 和 select "Delete" 并且可能,如果它要求,将单元格向上移动。或 2) 复制仅包含数据的单元格并将单元格粘贴到新作品sheet中,删除旧作品sheet并将新作品sheet重命名为之前的作品sheet ] 姓名。我希望这是有道理的。
我会使用这种方法来获取行数和列数,这将 return 非空单元格的结果。
// 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);