C#使用NOPI库实现导入Excel文档

发布时间 - 2026-01-11 00:57:42    点击率:

使用NOPI导入Excel文档

NOPI版本:2.3.0,依赖于NPOI的SharpZipLib版本:0.86,经测试适用于.net4.0+

记录遇到的几个问题

1.NOPI中的IWorkbook接口:xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现

2.日期转换,判断row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)

不能直接使用row.GetCell(j).DateCellValue,这玩意会直接抛出异常来~

1. 将文件流转换为DataTable

  /// <summary>
  /// 根据Excel格式读取Excel
  /// </summary>
  /// <param name="stream">文件流</param>
  /// <param name="type">Excel格式枚举类型,xls/xlsx</param>
  /// <param name="sheetName">表名,默认取第一张</param>
  /// <returns>DataTable</returns>
  private static DataTable ImportExcel(Stream stream, ExcelExtType type, string sheetName)
  {
    DataTable dt = new DataTable();
    IWorkbook workbook;
    try
    {
      //xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现
      switch (type)
      {
        case ExcelExtType.xlsx:
          workbook = new XSSFWorkbook(stream);
          break;
        default:
          workbook = new HSSFWorkbook(stream);
          break;
      }
      ISheet sheet = null;
      //获取工作表 默认取第一张
      if (string.IsNullOrWhiteSpace(sheetName))
        sheet = workbook.GetSheetAt(0);
      else
        sheet = workbook.GetSheet(sheetName);

      if (sheet == null)
        return null;
      IEnumerator rows = sheet.GetRowEnumerator();
      #region 获取表头
      IRow headerRow = sheet.GetRow(0);
      int cellCount = headerRow.LastCellNum;
      for (int j = 0; j < cellCount; j++)
      {
        ICell cell = headerRow.GetCell(j);
        if (cell != null)
        {
          dt.Columns.Add(cell.ToString());
        }
        else
        {
          dt.Columns.Add("");
        }
      }
      #endregion
      #region 获取内容
      for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
      {
        IRow row = sheet.GetRow(i);
        DataRow dataRow = dt.NewRow();

        for (int j = row.FirstCellNum; j < cellCount; j++)
        {
          if (row.GetCell(j) != null)
          {
            //判断单元格是否为日期格式
            if (row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)))
            {
              if (row.GetCell(j).DateCellValue.Year >=1970)
              {
                dataRow[j] = row.GetCell(j).DateCellValue.ToString();
              }
              else
              {
                dataRow[j] = row.GetCell(j).ToString();

              }
            }
            else
            {
              dataRow[j] = row.GetCell(j).ToString();
            }
          }
        }
        dt.Rows.Add(dataRow);
      }
      #endregion

    }
    catch (Exception ex)
    {
      dt=null;
    }
    finally
    {
      //if (stream != null)
      //{
      //  stream.Close();
      //  stream.Dispose();
      //}
    }
    return dt;
  }

2. 文件上载导入

  /// <summary>
  /// 上传Excel导入
  /// </summary>
  /// <param name="file">上载文件对象</param>
  /// <param name="errorMsg">错误信息</param>
  /// <param name="sheetName">表名,默认取第一张</param>
  /// <returns></returns>
  public static DataTable Import(System.Web.HttpPostedFileBase file, ref string errorMsg, string sheetName = "")
  {
    if (file == null || file.InputStream == null || file.InputStream.Length == 0)
    {
      errorMsg = "请选择要导入的Excel文件";
      return null;
    }
    var excelType = GetExcelFileType(file.FileName);
    if (excelType == null)
    {
      errorMsg = "请选择正确的Excel文件";
      return null;
    }
    using (var stream = new MemoryStream())
    {
      file.InputStream.Position = 0;
      file.InputStream.CopyTo(stream);
      var dt = ImportExcel(stream, excelType.Value, sheetName);
      if (dt == null)
        errorMsg = "导入失败,请选择正确的Excel文件";
      return dt;
    }
  }

3. 本地路径读取导入
 

  /// <summary>
  /// 根据文件路径导入Excel
  /// </summary>
  /// <param name="filePath"></param>
  /// <param name="errorMsg">错误信息</param>
  /// <param name="sheetName">表名,默认取第一张</param>
  /// <returns>可能为null的DataTable</returns>
  public static DataTable Import(string filePath, ref string errorMsg, string sheetName = "")
  {
    var excelType = GetExcelFileType(filePath);
    if (GetExcelFileType(filePath) == null)
    {
      errorMsg = "请选择正确的Excel文件";
      return null;
    }
    if (!File.Exists(filePath))
    {
      errorMsg = "没有找到要导入的Excel文件";
      return null;
    }
    DataTable dt;
    using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
      dt = ImportExcel(stream, excelType.Value, sheetName);
    }
    if (dt == null)
      errorMsg = "导入失败,请选择正确的Excel文件";
    return dt;
  }

4.完整demo

附赠一个winform导入Excel的Demo。

https://github.com/yimogit/NopiExcelDemo


# nopi  # 导入  # excel  # npoi实现excel导入导出  # C#导入导出Excel数据的两种方法  # 让C# Excel导入导出 支持不同版本Office  # C#导入导出EXCEL文件的代码实例  # C#数据导入/导出Excel文件及winForm导出Execl总结  # C# Winform实现导入和导出Excel文件  # C#的Excel导入、导出  # C#使用NPOI导入Excel的方法详解  # C#实现Excel表数据导入Sql Server数据库中的方法  # C#数据导入到EXCEL的方法  # C#使用NPOI实现Excel导入导出功能  # 请选择  # 第一张  # 错误信息  # 适用于  # 能为  # 没有找到  # 抛出  # 单元格  # 上传  # 文档  # 依赖于  # ImportExcel  # static  # returns  # private  # gt  # summary  # dt  # param  # sheetName 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 非常酷的网站设计制作软件,酷培ai教育官方网站?  教你用AI润色文章,让你的文字表达更专业  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  图册素材网站设计制作软件,图册的导出方式有几种?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何破解联通资金短缺导致的基站建设难题?  使用Dockerfile构建java web环境  Android使用GridView实现日历的简单功能  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel如何自定义分页视图?(Pagination示例)  如何在腾讯云服务器快速搭建个人网站?  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何快速搭建个人网站并优化SEO?  Laravel如何处理异常和错误?(Handler示例)  如何在万网ECS上快速搭建专属网站?  如何在自有机房高效搭建专业网站?  如何在万网自助建站平台快速创建网站?  如何在企业微信快速生成手机电脑官网?  如何快速启动建站代理加盟业务?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  SQL查询语句优化的实用方法总结  Python自动化办公教程_ExcelWordPDF批量处理案例  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  进行网站优化必须要坚持的四大原则  如何安全更换建站之星模板并保留数据?  如何确保西部建站助手FTP传输的安全性?  nginx修改上传文件大小限制的方法  如何有效防御Web建站篡改攻击?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  黑客入侵网站服务器的常见手法有哪些?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何打造高效商业网站?建站目的决定转化率  大学网站设计制作软件有哪些,如何将网站制作成自己app?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  清除minerd进程的简单方法