栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

  /// 
  /// 根据Excel格式读取Excel
  /// 
  /// 文件流
  /// Excel格式枚举类型,xls/xlsx
  /// 表名,默认取第一张
  /// DataTable
  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. 文件上载导入

  /// 
  /// 上传Excel导入
  /// 
  /// 上载文件对象
  /// 错误信息
  /// 表名,默认取第一张
  /// 
  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. 本地路径读取导入
 

  /// 
  /// 根据文件路径导入Excel
  /// 
  /// 
  /// 错误信息
  /// 表名,默认取第一张
  /// 可能为null的DataTable
  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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/123515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号