Update 1
如果您的目标是使用 c# 导入 Excel 数据,假设您已确定工作表中使用率最高的索引(在您发布的图片中,Col = 10,Row = 16),您可以将最大使用索引转换为字母,这样它将是J16
并使用 和 仅选择使用的范围OLEDBCommand
SELECT * FROM [Sheet1$A1:J16]
否则,我认为找到更快的方法并不容易。
您可以参考以下文章将索引转换为字母并使用OLEDB连接到excel:
- 如何将列号(例如127)转换为Excel列(例如AA) https://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa
- 允许 VB.NET 应用程序将 Excel 文件转换为数据表 https://stackoverflow.com/questions/47398344/allowing-vb-net-app-to-convert-excel-files-to-datatable/48141732#48141732
初步答复
正如您所说,您是从以下问题开始的:
- 使用 Interop 从 Excel 文件中删除空行和空列的最快方法 https://stackoverflow.com/questions/40574084/fastest-method-to-remove-empty-rows-and-columns-from-excel-files-using-interop
而你正试图“获取包含数据的最后一行以删除所有额外的空白(在此行或列之后)”
因此,假设您正在使用接受答案(由@JohnG https://stackoverflow.com/users/6842716/johng),因此您可以添加一些代码行来获取最后使用的行和列
空行存储在整数列表中rowsToDelete
您可以使用以下代码获取索引小于最后一个空行的最后一个非空行
List<int> NonEmptyRows = Enumerable.Range(1, rowsToDelete.Max()).ToList().Except(rowsToDelete).ToList();
And if NonEmptyRows.Max() < rowsToDelete.Max()
最后一个非空行是NonEmptyRows.Max()
否则就是worksheet.Rows.Count
并且在最后使用的行之后没有空行。
可以做同样的事情来获取最后一个非空列
代码编辑于DeleteCols
and DeleteRows
功能:
private static void DeleteRows(List<int> rowsToDelete, Microsoft.Office.Interop.Excel.Worksheet worksheet)
{
// the rows are sorted high to low - so index's wont shift
List<int> NonEmptyRows = Enumerable.Range(1, rowsToDelete.Max()).ToList().Except(rowsToDelete).ToList();
if (NonEmptyRows.Max() < rowsToDelete.Max())
{
// there are empty rows after the last non empty row
Microsoft.Office.Interop.Excel.Range cell1 = worksheet.Cells[NonEmptyRows.Max() + 1,1];
Microsoft.Office.Interop.Excel.Range cell2 = worksheet.Cells[rowsToDelete.Max(), 1];
//Delete all empty rows after the last used row
worksheet.Range[cell1, cell2].EntireRow.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftUp);
} //else last non empty row = worksheet.Rows.Count
foreach (int rowIndex in rowsToDelete.Where(x => x < NonEmptyRows.Max()))
{
worksheet.Rows[rowIndex].Delete();
}
}
private static void DeleteCols(List<int> colsToDelete, Microsoft.Office.Interop.Excel.Worksheet worksheet)
{
// the cols are sorted high to low - so index's wont shift
//Get non Empty Cols
List<int> NonEmptyCols = Enumerable.Range(1, colsToDelete.Max()).ToList().Except(colsToDelete).ToList();
if (NonEmptyCols.Max() < colsToDelete.Max())
{
// there are empty rows after the last non empty row
Microsoft.Office.Interop.Excel.Range cell1 = worksheet.Cells[1,NonEmptyCols.Max() + 1];
Microsoft.Office.Interop.Excel.Range cell2 = worksheet.Cells[1,NonEmptyCols.Max()];
//Delete all empty rows after the last used row
worksheet.Range[cell1, cell2].EntireColumn.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftToLeft);
} //else last non empty column = worksheet.Columns.Count
foreach (int colIndex in colsToDelete.Where(x => x < NonEmptyCols.Max()))
{
worksheet.Columns[colIndex].Delete();
}
}