.net core 使用NPOI导入Excel中的数据

1、项目的依赖项中添加NPOI的包

2、在需要使用的地方引用NPOI,接收前端上传的文件数据:

using NPOI.XSSF.UserModel;
// XSSF用于创建office2007及以后使用的格式,HSSF则是这之前的格式
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;

// 方法体
// 判定是否有文件传到后端
if (Request.Form.Files.Count>0)
{
  // 获取对应文件
  var file = Request.Form.Files[0];
  // 导入到这个地址
  string path = "d:\\数据接收";
  // 如果文件地址不存在,创建一个
  if (!Directory.Exists(path))
  {
    Directory.CreateDirectory(path);
  }
  // 用文件流上传到指定位置
  string fileName = Path.Combine(path, file.FileName);
  using(FileStream fs=new FileStream(fileName, FileMode.Create))
  {
    file.CopyTo(fs);
  }
  // 读取文件并获得详细数据,代码例在下方
}
else
{
  return GetErr<string>("导入失败!");
}

3、读取刚才导入的文件并获取详细数据传给数据库:

//获取指定地址的文件
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
  // 定义一个用于存储excel表数据的集合
  // 以下模拟存储的数据集合对应实体类为T,属性有Name、Age和CreateTime
  List<T> data = new List<T>();
  // 创建工作簿
  IWorkbook workbook = null;
  try
  {
    // .xlsx格式:XSSFWorkBook
    if (fileName.IndexOf(".xlsx", StringComparison.Ordinal) > 0)
    {
      workbook = new XSSFWorkbook(fs);
    }
    // .xls格式:HSSFWorkBook
    else if (fileName.IndexOf(".xls", StringComparison.Ordinal) > 0)
    {
      workbook = new HSSFWorkbook(fs);
    }
    // workbook不为空(文件格式正确)才继续执行
    if (workbook != null)
    {
      // 读取第一个sheet(表)
      ISheet sheet = workbook.GetSheetAt(0);
      int rowCount = sheet.LastRowNum;// 获取最后一行的索引值(总行数)
      // 确定表中一定有数据再继续执行
      if (rowCount > 0)
      {
        // 循环填入数据
        // FirstRowNum 第一个逻辑行
        for (int a = sheet.FirstRowNum; a <= rowCount; a++)
        {
          IRow row = sheet.GetRow(a);
          T model = new T()
          {
            Name = row.GetCell(0)?.ToString(),
            Age = row.GetCell(1)?.ToString(),
            CreateTime = DateTime.Now
          };
          data.Add(model);
        }
        // 与数据库交互
        var conn = BLL.ImportExcel(data);
        // 将结果正确返回给前端
        return Json(new Response(){ code=0, msg="导入成功!" });
      }
      else
      {
        // 将结果正确返回给前端
        return Json(new Response(){ code=-1, msg="表中没有数据" });
      }
    }
    else
    {
      // 将结果正确返回给前端
      return Json(new Response(){ code=0, msg="导入文件格式有误" });
    }
  }
  catch (Exception ex)
  {
    throw new Exception(ex.Message);
  }
}

至此导入完成。

posted @ 2021-11-06 15:49  盐巴鱼  阅读(660)  评论(0)    收藏  举报