小白来袭2 发表于 2021-7-26 15:04

c# excel内存流转为类(可任意定义属性名)

本帖最后由 小白来袭2 于 2021-8-5 16:04 编辑

项目经理昨天给我打电话,让我搞个excel转实体类,把数据存入数据库。我想“这玩意不是百度都有吗?”,所以先在百度搞了一个应付了一下!
项目经理:太啰嗦了,还没办法通用 ,重新搞一个通用的
我:.........,*******
mmp 搞就搞
/// <summary>
      /// 工作区转集合
      /// </summary>
      /// <param name="worksheet">工作区</param>
      /// <param name="filestream">工作区序号</param>
      /// <param name="openrow">开始行</param>
      /// <param name="opencol">开始列</param>
      /// <param name="endcol">结束列</param>
      /// <param name="endrow">结束行 默认全文</param>
      /// <returns></returns>
      public static List<T> WorksheetToDataRow<T>(Stream filestream,int worksheetindex, int openrow, int opencol, int endcol, int endrow = 0)
      {
            //判断文件是否为空
            if (filestream.Length < 1)
            {
                throw new Exception("文件不能为空");
            }
            //读取文件流
            ExcelPackage package = new ExcelPackage(filestream);
            //获取sheet表
            ExcelWorksheets worksheets = package.Workbook.Worksheets;
            ExcelWorksheet worksheet = worksheets;

            if (endrow == 0)
            {
                endrow = worksheet.Dimension.End.Row;
            }

            var ty = typeof(T);
            var properlist = ty.GetProperties();
            //查询带有excel特性的属性
            var excelproperlist = properlist.Where(o => o.GetCustomAttributesData().Where(o => o.AttributeType == typeof(ExcelToEntityAttribute)).Count() > 0).ToList();
            var requestlist = new List<T>();
            for (int i = openrow; i <= endrow; i++)
            {
                var good =System.Activator.CreateInstance<T>();
                for (int j = opencol; j <= endcol; j++)
                {
                  var value = worksheet.Cells.Value;
                  if (value != null)
                  {

                        excelproperlist.SetValue(good, Convert.ChangeType(value, excelproperlist.PropertyType));
                  }
                }
                requestlist.Add(good);
            }
            
            package.Dispose();
            return requestlist;
      }
到这里还没完,还差最重要的一步,就是让程序知道我的那些属性是要用来填充的
/// <summary>
      /// 产品编号
      /// </summary>
      
      public string GoodsNo { get; set; }

      /// <summary>
      /// 产品名称
      /// </summary>
      
      public string GoodsName { get; set; }

      /// <summary>
      /// 产品型号
      /// </summary>
      
      public string GoodsModel { get; set; }
这里使用c#的自定义特性
/// <summary>
    /// 自定义特性
    /// </summary>
   publicclass ExcelToEntityAttribute :System.Attribute
    {
    }
到这里整个转换就完成了,理论上可以完成任何类型的转换,不用在自己指定第几格是啥类型

这个东西看上去还可以,但是有个问题,那就是必须要在excel中的列排布要和类中属性的排布相同说句人话就是:不能改excel中列代表的意思
但是个人感觉还有很大改进空间,这种给项目经理应该没啥问题了

MCQI 发表于 2021-7-26 15:09

看不懂,表示加油

dglbh 发表于 2021-7-26 15:14

看不懂,做是什么东西,最好配图

limit7 发表于 2021-7-26 15:14

支持一下,直接读取成datatable是不是更方便点

小白来袭2 发表于 2021-7-26 15:16

limit7 发表于 2021-7-26 15:14
支持一下,直接读取成datatable是不是更方便点

读取成datatable,然后在变成实体类?这种就是我最开始被觉得啰嗦的东西
页: [1]
查看完整版本: c# excel内存流转为类(可任意定义属性名)