如何获取实际列范围 Spreadsheetgear
How to get actual columns range Spreadsheetgear
我有一个 Excel 工作表,其中有 50 行和 38 列“填充”了实际数据,但是当我尝试获取 .UsedRange 时,我得到超过 1025 行和 250 列作为使用范围!请让我知道我怎样才能只获得填充数据的实际使用范围并使用 Spreadsheetgear lib 检索实际范围数据?我试过类似的东西,但是当用户添加一些列时,它不起作用。
var workbook = Factory.GetWorkbook(filePath);
var worksheet = workbook.Worksheets[0];
var cells = worksheet.UsedRange;
var headerCount = 0;
// get columns size
for (var columnCount = 0; columnCount <= range.ColumnCount; ++columnCount)
{
if (columnCount > headers.Length && string.IsNullOrEmpty(range[HeaderRow, columnCount].Text))
{
headerCount = columnCount - 1;
break;
}
}
SpreadsheetGear(和 Excel 本身)会将单元格包含到 UsedRange 中,这些单元格为空但具有某种 formatting。例如,如果单元格 ABC123 具有自定义 NumberFormat、字体颜色或类似内容,UsedRange 将包括该单元格,因此可能会破坏你的 UsedRange A1:ABC123,即使实际的“值填充”或“填充”部分工作sheet要小得多。
如果这是一个问题,并且您只需要包含 sheet 中实际填充了单元格值的部分,下面是一个可能的例程,您可以使用它来仅包含具有以下内容的单元格某种单元格值。它被编写为 IWorksheet 的扩展方法,以便更容易地使用它,并包含一个 bool 标志,您可以传入该标志以便 return “正常” UsedRange(包括带有其他类型的格式)或此处讨论的“改变的”UsedRange:
public static class SGExtensionMethods
{
public static IRange GetUsedRange(this IWorksheet worksheet, bool ignoreEmptyCells)
{
IRange usedRange = worksheet.UsedRange;
if (!ignoreEmptyCells)
return usedRange;
// Find last row in used range with a cell containing data.
IRange foundCell = usedRange.Find("*", usedRange[0, 0], FindLookIn.Formulas,
LookAt.Part, SearchOrder.ByRows, SearchDirection.Previous, false);
int lastRow = foundCell?.Row ?? 0;
// Find last column in used range with a cell containing data.
foundCell = usedRange.Find("*", usedRange[0, 0], FindLookIn.Formulas,
LookAt.Part, SearchOrder.ByColumns, SearchDirection.Previous, false);
int lastCol = foundCell?.Column ?? 0;
// Return a new used range that clips of any empty rows/cols.
return worksheet.Cells[worksheet.UsedRange.Row, worksheet.UsedRange.Column, lastRow, lastCol];
}
}
关于此方法的一些附加说明。它通常会考虑隐藏的行或列——这意味着具有单元格值的隐藏行或列将包含在 UsedRange 中。包含隐藏行或列的一个例外/边缘情况是,如果在工作中启用了自动筛选器sheet。这将 worksheet 置于一种特殊的“模式”,从搜索结果中排除隐藏的行。因此,如果启用了 AutoFilters(在这种情况下 IWorksheet.AutoFilterMode 将为真),如果 AutoFiltered 范围的最后一行或最后一列可能已被过滤,您可能无法依赖此方法出来了。
我有一个 Excel 工作表,其中有 50 行和 38 列“填充”了实际数据,但是当我尝试获取 .UsedRange 时,我得到超过 1025 行和 250 列作为使用范围!请让我知道我怎样才能只获得填充数据的实际使用范围并使用 Spreadsheetgear lib 检索实际范围数据?我试过类似的东西,但是当用户添加一些列时,它不起作用。
var workbook = Factory.GetWorkbook(filePath);
var worksheet = workbook.Worksheets[0];
var cells = worksheet.UsedRange;
var headerCount = 0;
// get columns size
for (var columnCount = 0; columnCount <= range.ColumnCount; ++columnCount)
{
if (columnCount > headers.Length && string.IsNullOrEmpty(range[HeaderRow, columnCount].Text))
{
headerCount = columnCount - 1;
break;
}
}
SpreadsheetGear(和 Excel 本身)会将单元格包含到 UsedRange 中,这些单元格为空但具有某种 formatting。例如,如果单元格 ABC123 具有自定义 NumberFormat、字体颜色或类似内容,UsedRange 将包括该单元格,因此可能会破坏你的 UsedRange A1:ABC123,即使实际的“值填充”或“填充”部分工作sheet要小得多。
如果这是一个问题,并且您只需要包含 sheet 中实际填充了单元格值的部分,下面是一个可能的例程,您可以使用它来仅包含具有以下内容的单元格某种单元格值。它被编写为 IWorksheet 的扩展方法,以便更容易地使用它,并包含一个 bool 标志,您可以传入该标志以便 return “正常” UsedRange(包括带有其他类型的格式)或此处讨论的“改变的”UsedRange:
public static class SGExtensionMethods
{
public static IRange GetUsedRange(this IWorksheet worksheet, bool ignoreEmptyCells)
{
IRange usedRange = worksheet.UsedRange;
if (!ignoreEmptyCells)
return usedRange;
// Find last row in used range with a cell containing data.
IRange foundCell = usedRange.Find("*", usedRange[0, 0], FindLookIn.Formulas,
LookAt.Part, SearchOrder.ByRows, SearchDirection.Previous, false);
int lastRow = foundCell?.Row ?? 0;
// Find last column in used range with a cell containing data.
foundCell = usedRange.Find("*", usedRange[0, 0], FindLookIn.Formulas,
LookAt.Part, SearchOrder.ByColumns, SearchDirection.Previous, false);
int lastCol = foundCell?.Column ?? 0;
// Return a new used range that clips of any empty rows/cols.
return worksheet.Cells[worksheet.UsedRange.Row, worksheet.UsedRange.Column, lastRow, lastCol];
}
}
关于此方法的一些附加说明。它通常会考虑隐藏的行或列——这意味着具有单元格值的隐藏行或列将包含在 UsedRange 中。包含隐藏行或列的一个例外/边缘情况是,如果在工作中启用了自动筛选器sheet。这将 worksheet 置于一种特殊的“模式”,从搜索结果中排除隐藏的行。因此,如果启用了 AutoFilters(在这种情况下 IWorksheet.AutoFilterMode 将为真),如果 AutoFiltered 范围的最后一行或最后一列可能已被过滤,您可能无法依赖此方法出来了。