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

我可以成功读取文件,并使用以下代码从第二个(第一个仅包含 header )到最后一行获取所有值:

...
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...。我认为这与绑定(bind)到手动清理工作表单元格的某些属性有关。

您是否有解决此问题的提示?

最佳答案

我简化了吗?

 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;
        }

关于c# - NPOI-获取Excel行计数以检查其是否为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31344841/

10-10 18:46
查看更多