C#的Excel导入、导出

2019-12-30 12:34:56王冬梅
这篇文章主要为大家详细介绍了C#的Excel导入、导出的相关资料,需要的朋友可以参考下  

本篇主要介绍C#的Excel导入、导出,供大家参考,具体内容如下

一. 介绍
1.1 第三方类库:NPOI

说明:NPOI是POI项目的.NET 版本,可用于Excel、Word的读写操作。

优点:不用装Office环境。

下载地址:http://www.easck.com/releases

1.2 Excel结构介绍

工作簿(Workbook):每个Excel文件可理解为一个工作簿。

工作表(Sheet):一个工作簿(Workbook)可以包含多个工作表。

行(row):一个工作表(Sheet)可以包含多个行。

C#,Excel

二. Excel导入
2.1 操作流程

C#,Excel

2.2 NPOI操作代码

说明:把Excel文件转换为List<T>

步骤:

①读取Excel文件并以此初始化一个工作簿(Workbook);

②从工作簿上获取一个工作表(Sheet);默认为工作薄的第一个工作表;

③遍历工作表所有的行(row);默认从第二行开始遍历,第一行(序号0)为单元格头部;

④遍历行的每一个单元格(cell),根据一定的规律赋值给对象的属性。

代码:

 


/// <summary>
/// 从Excel2003取数据并记录到List集合里
/// </summary>
/// <param name="cellHeard">单元头的Key和Value:{ { "UserName", "姓名" }, { "Age", "年龄" } };</param>
/// <param name="filePath">保存文件绝对路径</param>
/// <param name="errorMsg">错误信息</param>
/// <returns>转换好的List对象集合</returns>
private static List<T> Excel2003ToEntityList<T>(Dictionary<string, string> cellHeard, string filePath, out StringBuilder errorMsg) where T : new()
{
  errorMsg = new StringBuilder(); // 错误信息,Excel转换到实体对象时,会有格式的错误信息
  List<T> enlist = new List<T>(); // 转换后的集合
  List<string> keys = cellHeard.Keys.ToList(); // 要赋值的实体对象属性名称
  try
  {
    using (FileStream fs = File.OpenRead(filePath))
    {
      HSSFWorkbook workbook = new HSSFWorkbook(fs);
      HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0); // 获取此文件第一个Sheet页
      for (int i = 1; i <= sheet.LastRowNum; i++) // 从1开始,第0行为单元头
      {
        // 1.判断当前行是否空行,若空行就不在进行读取下一行操作,结束Excel读取操作
        if (sheet.GetRow(i) == null)
        {
          break;
        }
 
        T en = new T();
        string errStr = ""; // 当前行转换时,是否有错误信息,格式为:第1行数据转换异常:XXX列;
        for (int j = 0; j < keys.Count; j++)
        {
          // 2.若属性头的名称包含'.',就表示是子类里的属性,那么就要遍历子类,eg:UserEn.TrueName
          if (keys[j].IndexOf(".") >= 0)
          {
            // 2.1解析子类属性
            string[] properotyArray = keys[j].Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
            string subClassName = properotyArray[0]; // '.'前面的为子类的名称
            string subClassProperotyName = properotyArray[1]; // '.'后面的为子类的属性名称
            System.Reflection.PropertyInfo subClassInfo = en.GetType().GetProperty(subClassName); // 获取子类的类型
            if (subClassInfo != null)
            {
              // 2.1.1 获取子类的实例
              var subClassEn = en.GetType().GetProperty(subClassName).GetValue(en, null);
              // 2.1.2 根据属性名称获取子类里的属性信息
              System.Reflection.PropertyInfo properotyInfo = subClassInfo.PropertyType.GetProperty(subClassProperotyName);
              if (properotyInfo != null)
              {
                try
                {
                  // Excel单元格的值转换为对象属性的值,若类型不对,记录出错信息
                  properotyInfo.SetValue(subClassEn, GetExcelCellToProperty(properotyInfo.PropertyType, sheet.GetRow(i).GetCell(j)), null);
                }
                catch (Exception e)
                {
                  if (errStr.Length == 0)
                  {
                    errStr = "第" + i + "行数据转换异常:";
                  }
                  errStr += cellHeard[keys[j]] + "列;";
                }
                 
              }
            }
          }
          else
          {
            // 3.给指定的属性赋值
            System.Reflection.PropertyInfo properotyInfo = en.GetType().GetProperty(keys[j]);
            if (properotyInfo != null)
            {
              try
              {
                // Excel单元格的值转换为对象属性的值,若类型不对,记录出错信息
                properotyInfo.SetValue(en, GetExcelCellToProperty(properotyInfo.PropertyType, sheet.GetRow(i).GetCell(j)), null);
              }
              catch (Exception e)
              {
                if (errStr.Length == 0)
                {
                  errStr = "第" + i + "行数据转换异常:";
                }
                errStr += cellHeard[keys[j]] + "列;";
              }
            }
          }
        }
        // 若有错误信息,就添加到错误信息里
        if (errStr.Length > 0)
        {
          errorMsg.AppendLine(errStr);
        }
        enlist.Add(en);
      }
    }
    return enlist;
  }
  catch (Exception ex)
  {
    throw ex;
  }
}