NPOI - 获取excel行数以检查它是否为空

时间:2015-07-10 15:37:36

标签: c# excel npoi

我正在使用xlsx lib读取NPOI文件,C#。我需要提取一些excel列并将提取的值保存到某种数据结构中。

我可以使用以下代码成功读取文件并将第二个(第一个只包含标题)的所有值传递到最后一行:

...
workbook = new XSSFWorkbook(fs);
sheet = (XSSFSheet)workbook.GetSheetAt(0);
....
int rowIndex = 1;  //--- SKIP FIRST ROW (index == 0) AS IT CONTAINS TEXT HEADERS
while (sheet.GetRow(rowIndex) != null) {
    for (int i = 0; i < this.columns.Count; i++){
       int colIndex = this.columns[i].colIndex;
       ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
       cell.SetCellType(CellType.String);
       String cellValue = cell.StringCellValue;
       this.columns[i].values.Add(cellValue); //--- Here I'm adding the value to a custom data structure
    }
    rowIndex++;
}

我现在要做的是检查excel文件是否为空或者只有1行才能正确处理问题并显示消息

如果我针对只有1行(标题)的excel文件运行我的代码,它就会中断

cell.SetCellType(CellType.String); //--- here cell is null

出现以下错误:

Object reference not set to an instance of an object.

我还尝试用

获取行数
sheet.LastRowNum

但它没有返回正确的行数。例如,我创建了一个包含5行(1xHEADER + 4xDATA)的excel,代码成功读取了excel值。在同一个excel上,我删除了4个数据行,然后我再次启动了excel文件上的代码。 sheet.LastRowNum继续返回4而不是1 ....我认为这与绑定到手动清理的图纸单元格的某些属性有关。

您有什么提示可以解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

我认为使用sheet.LastRowNum是明智的,它应该返回当前工作表上的行数

答案 1 :(得分:3)

我过度简化了吗?

 bool hasContent = false;

 while (sheet.GetRow(rowIndex) != null)
        {
            var row = rows.Current as XSSFRow;
            //all cells are empty, so is a 'blank row'
            if (row.Cells.All(d => d.CellType == CellType.Blank)) continue;  


            hasContent = true;
        }

答案 2 :(得分:0)

您可以使用以下代码检索行数:

public int GetTotalRowCount(bool warrant = false)
{
    IRow headerRow = activeSheet.GetRow(0);
    if (headerRow != null)
    {
        int rowCount = activeSheet.LastRowNum + 1;
        return rowCount;
    }
    return 0;
}

答案 3 :(得分:0)

以下是获取实际最后一行索引和实际存在行数的方法:

    public static int LastRowIndex(this ISheet aExcelSheet)
    {
        IEnumerator rowIter = aExcelSheet.GetRowEnumerator();
        return rowIter.MoveNext()
        ? aExcelSheet.LastRowNum
        : -1;
    }

    public static int RowsSpanCount(this ISheet aExcelSheet)
    {
        return aExcelSheet.LastRowIndex() + 1;
    }

    public static int PhysicalRowsCount(this ISheet aExcelSheet )
    {
        if (aExcelSheet == null)
        {
            return 0;
        }

        int rowsCount = 0;
        IEnumerator rowEnumerator = aExcelSheet.GetRowEnumerator();
        while (rowEnumerator.MoveNext())
        {
            ++rowsCount;
        }

        return rowsCount;
    }