.NET小笔记-NPOI读取excel内容到DataTable

下载比较新的NPOI组件支持excel2007以上的,把.dll添加引用

引入命名空间 

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

直接调用下面方法,把excel内容转为DataTable

 /// <summary>
       /// 获取excel内容
       /// </summary>
       /// <param name="filePath">excel文件路径</param>
       /// <returns></returns>
       public static DataTable ImportExcel(string filePath)
       {
           DataTable dt = new DataTable();
           using (FileStream fsRead = System.IO.File.OpenRead(filePath))
           {
               IWorkbook wk = null;
               //获取后缀名
               string extension = filePath.Substring(filePath.LastIndexOf(".")).ToString().ToLower();
              //判断是否是excel文件
               if (extension == ".xlsx" || extension == ".xls")
               {
                   //判断excel的版本
                   if (extension== ".xlsx")
                   {
                      wk = new XSSFWorkbook(fsRead);
                  }
                  else
                  {
                      wk = new HSSFWorkbook(fsRead);
                  }
              
               //获取第一个sheet
              ISheet sheet = wk.GetSheetAt(0);
               //获取第一行
              IRow headrow=sheet.GetRow(0);
              //创建列
              for (int i = headrow.FirstCellNum; i < headrow.Cells.Count; i++)
              {
                //  DataColumn datacolum = new DataColumn(headrow.GetCell(i).StringCellValue);
                  DataColumn datacolum = new DataColumn("F"+(i+1));
                  dt.Columns.Add(datacolum);
              }
              //读取每行,从第二行起
              for (int r = 1; r <= sheet.LastRowNum; r++)
              {
                  bool result = false;
                  DataRow dr = dt.NewRow();
                  //获取当前行
                  IRow row = sheet.GetRow(r);
                  //读取每列
                  for (int j = 0; j < row.Cells.Count; j++)
                  {
                      ICell cell = row.GetCell(j); //一个单元格
                      dr[j] = GetCellValue(cell); //获取单元格的值
                      //全为空则不取
                      if (dr[j].ToString() != "")
                      {
                          result = true;
                      }
                  }
                  if (result == true)
                  {
                      dt.Rows.Add(dr); //把每行追加到DataTable
                  }
              }
              }
              
          }
          return dt;
      }
//对单元格进行判断取值
      private static string GetCellValue(ICell cell)
      {
          if (cell == null)
              return string.Empty;
          switch (cell.CellType)
          {
                 case CellType.Blank: //空数据类型 这里类型注意一下,不同版本NPOI大小写可能不一样,有的版本是Blank(首字母大写)
                     return string.Empty;
                 case CellType.Boolean: //bool类型
                     return cell.BooleanCellValue.ToString();
                 case CellType.Error:
                     return cell.ErrorCellValue.ToString();
                 case CellType.Numeric: //数字类型
                     if(HSSFDateUtil.IsCellDateFormatted(cell))//日期类型
                     {
                         return cell.DateCellValue.ToString();
                     }
                     else //其它数字
                     {
                         return cell.NumericCellValue.ToString ();
                     }
                 case CellType.Unknown: //无法识别类型
                 default: //默认类型
                     return cell.ToString();//
                 case CellType.String: //string 类型
                     return cell.StringCellValue;
                 case CellType.Formula: //带公式类型
                     try
                     {
                         HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
                         e.EvaluateInCell(cell);
                         return cell.ToString();
                     }
                     catch
                     {
                         return cell.NumericCellValue.ToString();
                     }
             }
         }

测试例子

我把一个名为aaa.xlsx的excel放根目录下,内容为

其中 C4是公式,其它的正常

执行代码

string filePath = Server.MapPath("~/aaa.xlsx");
DataTable dt = new DataTable();
if (File.Exists(filePath))
{
dt = ImportExcel(filePath);
}

然后打断点监测一下dt ,内容为

 

posted on 2015-09-30 16:12  包子wxl  阅读(9292)  评论(3编辑  收藏  举报