全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

使用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 


相关文章: 浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  ,想在网上投简历,哪几个网站比较好?  宿州网站制作公司兴策,安徽省低保查询网站?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  小型网站建站如何选择虚拟主机?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  建站之星后台管理如何实现高效配置?  如何选购建站域名与空间?自助平台全解析  网站制作需要会哪些技术,建立一个网站要花费多少?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  c# 在高并发场景下,委托和接口调用的性能对比  网站图片在线制作软件,怎么在图片上做链接?  广州建站公司哪家好?十大优质服务商推荐  历史网站制作软件,华为如何找回被删除的网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  安云自助建站系统如何快速提升SEO排名?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  制作网站外包平台,自动化接单网站有哪些?  如何用景安虚拟主机手机版绑定域名建站?  如何在橙子建站上传落地页?操作指南详解  建站主机数据库如何配置才能提升网站性能?  网站制作公司,橙子建站是合法的吗?  如何制作一个表白网站视频,关于勇敢表白的小标题?  网站制作企业,网站的banner和导航栏是指什么?  建站之星如何快速生成多端适配网站?  太原网站制作公司有哪些,网约车营运证查询官网?  网站代码制作软件有哪些,如何生成自己网站的代码?  制作电商网页,电商供应链怎么做?  建站主机解析:虚拟主机配置与服务器选择指南  b2c电商网站制作流程,b2c水平综合的电商平台?  一键网站制作软件,义乌购一件代发流程?  XML的“混合内容”是什么 怎么用DTD或XSD定义  javascript中的try catch异常捕获机制用法分析  建站之星IIS配置教程:代码生成技巧与站点搭建指南  购物网站制作公司有哪些,哪个购物网站比较好?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  定制建站流程步骤详解:一站式方案设计与开发指南  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何快速生成ASP一键建站模板并优化安全性?  如何快速搭建FTP站点实现文件共享?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站VPS能否同时实现高效与安全翻墙?  如何在云指建站中生成FTP站点?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  如何在阿里云ECS服务器部署织梦CMS网站?  网站企业制作流程,用什么语言做企业网站比较好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。