吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1640|回复: 6
收起左侧

[其他转载] c# excel内存流转为类(可任意定义属性名)

[复制链接]
小白来袭2 发表于 2021-8-5 16:05
本帖最后由 小白来袭2 于 2021-8-6 19:25 编辑

项目经理昨天给我打电话,让我搞个excel转实体类,把数据存入数据库。我想“这玩意不是百度都有吗?”,所以先在百度搞了一个应付了一下!
项目经理:太啰嗦了,还没办法通用 ,重新搞一个通用的
我:.........,*******
mmp 搞就搞
[C#] 纯文本查看 复制代码
/// <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) 
        {
            try
            {
                //判断文件是否为空
                if (filestream.Length < 1)
                {
                    throw new Exception("文件不能为空");
                }
                //读取文件流
                ExcelPackage package = new ExcelPackage(filestream);
                //获取sheet表
                ExcelWorksheets worksheets = package.Workbook.Worksheets;
                ExcelWorksheet worksheet = worksheets[worksheetindex];

                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>();
                int entityidx = 0;
                for (int i = openrow; i <= endrow; i++)
                {
                    var good = Activator.CreateInstance<T>();
                    for (int j = opencol; j <= endcol; j++)
                    {
                        var value = worksheet.Cells[i, j].Value;
                        Type valueType = excelproperlist[entityidx ].PropertyType;
                        
                        if (valueType.IsEnum)
                        {
                            if (!Enum.TryParse(valueType, value.ToString(), out value))
                            {
                                throw new Exception("枚举数据无法转移") ;
                            } 
                        }
                        else
                        {
                            value= Convert.ChangeType(value, valueType);
                        }
                        
                        

                        if (value != null)
                        {

                            excelproperlist[entityidx ].SetValue(good, value);
                        }
                    entityidx ++;
                    }
                    requestlist.Add(good);
                }

                package.Dispose();
                return requestlist;
            }
            catch (Exception ex)
            {

                throw ex;
            }
           
        }

到这里还没完,还差最重要的一步,就是让程序知道我的那些属性是要用来填充的
[C#] 纯文本查看 复制代码
/// <summary>
        /// 产品编号
        /// </summary>
        [ExcelToEntity]
        public string GoodsNo { get; set; }

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

        /// <summary>
        /// 产品型号
        /// </summary>
        [ExcelToEntity]
        public string GoodsModel { get; set; }

这里使用c#的自定义特性
[C#] 纯文本查看 复制代码
/// <summary>
    /// 自定义特性
    /// </summary>
   public  class ExcelToEntityAttribute :System.Attribute
    {
    }

到这里整个转换就完成了,理论上可以完成任何类型的转换,不用在自己指定第几格是啥类型

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


Class.png
Excel.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
AusakWindLing + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

灿烂的小居 发表于 2021-8-5 16:43
哈哈哈哈哈,当程序员在飞快敲击键盘的时候,往往不是编code,而是在怼人。
感谢分享
亿联网络 发表于 2021-8-5 17:32
灿烂的小居 发表于 2021-8-5 16:43
哈哈哈哈哈,当程序员在飞快敲击键盘的时候,往往不是编code,而是在怼人。
感谢分享

太真实了  程序员都是这样的吗  爱怼
wwaaffll 发表于 2021-8-5 18:18
头像被屏蔽
asdswd 发表于 2021-8-5 18:51
提示: 作者被禁止或删除 内容自动屏蔽
bigcan 发表于 2021-8-5 20:02
单元格是公式、科学记数法、不规则日期都没处理吧,大概率报异常
 楼主| 小白来袭2 发表于 2021-8-6 17:43
bigcan 发表于 2021-8-5 20:02
单元格是公式、科学记数法、不规则日期都没处理吧,大概率报异常

感谢提醒,最近修复
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 13:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表