如何获取实际列范围 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 范围的最后一行或最后一列可能已被过滤,您可能无法依赖此方法出来了。