zoukankan      html  css  js  c++  java
  • .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 ,内容为

  • 相关阅读:
    Selenium WebDriver 中鼠标事件(全)
    日常知识积累加不定期更新(一)
    动作手游实时PVP技术揭密(服务器篇)
    Java RMI之HelloWorld篇
    java中注解的使用与实例 (二)
    RPC原理及RPC实例分析
    动作手游实时PVP帧同步方案(客户端)
    java中注解的使用与实例(一)
    动作手游实时PVP技术揭密(服务器篇)
    AS3.0 几何结构 Point对象和Rectangle对象
  • 原文地址:https://www.cnblogs.com/wei325/p/4849487.html
Copyright © 2011-2022 走看看