解决c# npoi 导入 中间单元格未激活 ,对应datatable 顺序混乱的问题.或nopi 单元格中间 null 空值 null 空值 后续读取不到问题

场景:今天做一个导入功能,通用的npoi 导入代码,都是 先准备好一个datatable ,绘制标题列,然后遍历excel ,循环赋值 .

正常情况下,如果表格内都有值,或者是 空字符串单元格也可以,即 所有单元格都是激活状态.读取正常

常用代码这样:

  int rowCount = sheet.LastRowNum;
                    for (int i = startRow; i <= rowCount; ++i)
                    {
                        IRow row = sheet.GetRow(i);
                        if (row == null || row.Cells.Count == 0) continue; //没有数据的行默认是null       

                        DataRow dataRow = data.NewRow();

                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                        {
                            if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
                                dataRow[j] = row.Cells[j];
                            // Convert.ToDateTime();
                        }

                        data.Rows.Add(dataRow);
                    }
                }

但是如果中间有未激活的代码 if (row.GetCell(j) != null) 这句就出错了,因为假如24列,但是中间有2个未激活单元格,那sheet.GetRow(i);

只有 22列,所以代码运行到这就出错,而且会导致table不对应赋值.

解决方法如下:

  //最后一列的标号
                    int rowCount = sheet.LastRowNum;
                    for (int i = startRow; i <= rowCount; ++i)
                    { 
                        IRow row = sheet.GetRow(i);  
                        if (row == null || row.Cells.Count == 0) continue; //没有数据的行默认是null       

                        DataRow dataRow = data.NewRow(); 
                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                        {
                            try
                            {
                                //防止中间有未激活的单元格  用row.GetCell(j) != null 判定空最后一个无效,不知道什么原因,所以用try
                                int ColumnIndex = row.Cells[j].ColumnIndex; //获取真正的列索引,防止列混乱,否则对应datatable列错误
                                dataRow[ColumnIndex] = row.Cells[j];
                                //if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
                                //    dataRow[j] = row.Cells[j];
                            }
                            catch 
                            { }
                            // Convert.ToDateTime();
                        }

                        data.Rows.Add(dataRow);
                    }