Epplus下的一个将Excel转换成List的范型帮助类

因为前一段时间公司做项目的时候,用到了Excel导入和导出,然后自己找了个插件Epplus进行操作,自己将当时的一些代码抽离出来写了一个帮助类。

因为帮助类是在Epplus基础之上写的,项目需要引用Epplus.dll。自己基础不是很扎实,有问题的地方欢迎指导。

1.用法,默认excel第一列是头部信息。

    public class UserInfo : XlsRow
    {
        public int id { get; set; }
        public string username { get; set; }
        public string address { get; set; }
        public int userage { get; set; }
        public DateTime birthday { get; set; }
        public decimal total { get; set; }
        public string grade { get; set; }
    }

      static void Main(string[] args)
        {
            string filePath = "E:\\ExcelConvertEntity\\datatest.xlsx";

            //转换address列的时候在所有地址钱添加“上海市”三个字
            ECEntityCOM<UserInfo>.ForMember(e => e.address, e => "上海市:" + e);

            //excel列name对应实体username进行映射
            ECEntityCOM<UserInfo>.ForMember("name", e => e.username);

            //列名age映射到实体userage属性,映射过程中给所有age加5
            ECEntityCOM<UserInfo>.ForMember("age", e => e.userage, e => Convert.ToInt32(e) + 5);

            //读取excel转换成List<UserInfo>
            List<UserInfo> list = ECEntityCOM<UserInfo>.LoadFromExcel(filePath);

            Console.WriteLine("ok");
            Console.ReadLine();
        }

a.实体需要继承我的自定义实体XlsRow,这个实体会记录转换过程出错信息,转换这一行的时候,是否出现过错误,具体是那一列出错的。转换出错单元格内内容是什么,还有错误信息。

  public class XlsRow
    {
        /// <summary>
        /// 错误信息
        /// </summary>
        public List<string> ErrMessage { get; set; }

        /// <summary>
        /// 错误列名
        /// </summary>
        public List<string> ErrColumn { get; set; }

        /// <summary>
        /// 错误内容
        /// </summary>
        public List<string> ErrValue { get; set; }

        /// <summary>
        /// 是否转换出错(false:未出错,true:出错)
        /// </summary>
        public bool IsErr { get; set; }
    }

然后转换过程中提供了几个方法,用来更好的自定义转换形式。

b.转换过程中,某一列统一进行某些处理操作,最后把处理后的信息存进实体列名里。

        //转换address列的时候在所有地址钱添加“上海市”三个字
            ECEntityCOM<UserInfo>.ForMember(e => e.address, e => "上海市:" + e);

c.实体名跟excel列头部名称不一致,可以自定义映射。

       //excel列name对应实体username进行映射
            ECEntityCOM<UserInfo>.ForMember("name", e => e.username);

d.自定义映射对excel单元格信息进行处理。

           //列名age映射到实体userage属性,映射过程中给所有age加5
            ECEntityCOM<UserInfo>.ForMember("age", e => e.userage, e => Convert.ToInt32(e) + 5);    

帮助类:

    #region 需要用到的实体

    public class XlsEntity
    {
        /// <summary>
        /// 实体名称
        /// </summary>
        public string EntityName { get; set; }

        /// <summary>
        /// 列名称
        /// </summary>
        public string ColumnName { get; set; }

        /// <summary>
        /// 列下标
        /// </summary>
        public int ColumnIndex { get; set; }

        /// <summary>
        /// 转换方法
        /// </summary>
        public Func<string, object> ConvertFunc { get; set; }
    }

    public class XlsRow
    {
        /// <summary>
        /// 错误信息
        /// </summary>
        public List<string> ErrMessage { get; set; }

        /// <summary>
        /// 错误列名
        /// </summary>
        public List<string> ErrColumn { get; set; }

        /// <summary>
        /// 错误内容
        /// </summary>
        public List<string> ErrValue { get; set; }

        /// <summary>
        /// 是否转换出错(false:未出错,true:出错)
        /// </summary>
        public bool IsErr { get; set; }
    }

    #endregion

    public class ECEntityCOM<T> where T : XlsRow, new()
    {

        private static List<XlsEntity> xlsHeader = new List<XlsEntity>();

        #region 初始化转换形式

        public static void ForMember(Expression<Func<T, object>> entityExpression, Func<string, object> func)
        {
            XlsEntity xlsEntity = new XlsEntity();
            xlsEntity.EntityName = GetPropertyName(entityExpression);
            xlsEntity.ColumnName = xlsEntity.EntityName;
            xlsEntity.ConvertFunc = func;
            xlsHeader.Add(xlsEntity);
        }

        public static void ForMember(string columnName, Expression<Func<T, object>> entityExpression)
        {
            XlsEntity xlsEntity = new XlsEntity();
            xlsEntity.ColumnName = columnName;
            xlsEntity.EntityName = GetPropertyName(entityExpression);
            xlsHeader.Add(xlsEntity);
        }

        public static void ForMember(string columnName, string entityName)
        {
            XlsEntity xlsEntity = new XlsEntity();
            xlsEntity.ColumnName = columnName;
            xlsEntity.EntityName = entityName;
            xlsHeader.Add(xlsEntity);
        }

        public static void ForMember(string columnName, string entityName, Func<string, object> func)
        {
            XlsEntity xlsEntity = new XlsEntity();
            xlsEntity.ColumnName = columnName;
            xlsEntity.EntityName = entityName;
            xlsEntity.ConvertFunc = func;
            xlsHeader.Add(xlsEntity);
        }

        public static void ForMember(string columnName, Expression<Func<T, object>> entityExpression, Func<string, object> func)
        {
            XlsEntity xlsEntity = new XlsEntity();
            xlsEntity.ColumnName = columnName;
            xlsEntity.EntityName = GetPropertyName(entityExpression);
            xlsEntity.ConvertFunc = func;
            xlsHeader.Add(xlsEntity);
        }

        #endregion

        #region 从Excel中加载数据(泛型)

        public static List<T> LoadFromExcel(string filePath)
        {
            FileInfo existingFile = new FileInfo(filePath);
            List<T> resultList = new List<T>();

            using (ExcelPackage package = new ExcelPackage(existingFile))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[1];

                int colStart = worksheet.Dimension.Start.Column;
                int colEnd = worksheet.Dimension.End.Column;
                int rowStart = worksheet.Dimension.Start.Row;
                int rowEnd = worksheet.Dimension.End.Row;

                PropertyInfo[] propertyInfoList = typeof(T).GetProperties();
                XlsEntity xlsEntity;

                #region 将实体和excel列标题进行对应绑定,添加到集合中

                for (int i = colStart; i <= colEnd; i++)
                {
                    string columnName = worksheet.Cells[rowStart, i].Value.ToString();

                    xlsEntity = xlsHeader.FirstOrDefault(e => e.ColumnName == columnName);

                    for (int j = 0; j < propertyInfoList.Length; j++)
                    {

                        if (xlsEntity != null && xlsEntity.ColumnName == columnName)
                        {
                            xlsEntity.ColumnIndex = i;
                            xlsHeader.Add(xlsEntity);
                        }
                        else if (propertyInfoList[j].Name == columnName)
                        {
                            xlsEntity = new XlsEntity();
                            xlsEntity.ColumnName = columnName;
                            xlsEntity.EntityName = propertyInfoList[j].Name;
                            xlsEntity.ColumnIndex = i;
                            xlsHeader.Add(xlsEntity);
                            break;
                        }
                    }
                }

                #endregion

                #region 根据对应的实体名列名的对应绑定就行值的绑定

                for (int row = rowStart + 1; row < rowEnd; row++)
                {
                    T result = new T();
                    foreach (PropertyInfo p in propertyInfoList)
                    {
                        var xlsRow = xlsHeader.FirstOrDefault(e=> e.EntityName == p.Name);
                        if (xlsRow == null) continue;

                        ExcelRange cell = worksheet.Cells[row, xlsRow.ColumnIndex];
                        if (cell.Value == null) continue;

                        try
                        {
                            if (xlsRow.ConvertFunc != null)
                            {
                                object entityValue = xlsRow.ConvertFunc(cell.Value.ToString());
                                p.SetValue(result, entityValue);
                            }
                            else
                            {
                                cellBindValue(result, p, cell);
                            }
                        }
                        catch (Exception ex)
                        {
                            if (result.ErrColumn == null) result.ErrColumn = new List<string>();
                            if (result.ErrMessage == null) result.ErrMessage = new List<string>();
                            if (result.ErrValue == null) result.ErrValue = new List<string>();
                            result.ErrColumn.Add(p.Name);
                            result.ErrMessage.Add(ex.Message);
                            result.ErrValue.Add(cell.Value.ToString());
                            result.IsErr = true;
                        }
                    }
                    resultList.Add(result);
                }

                #endregion
            }
            return resultList;
        }

        #endregion

        #region 给实体绑定值

        private static void cellBindValue(T result, PropertyInfo p, ExcelRange cell)
        {
            switch (p.PropertyType.Name.ToLower())
            {
                case "string":
                    p.SetValue(result, cell.GetValue<String>());
                    break;
                case "int16":
                    p.SetValue(result, cell.GetValue<Int16>());
                    break;
                case "int32":
                    p.SetValue(result, cell.GetValue<Int32>());
                    break;
                case "int64":
                    p.SetValue(result, cell.GetValue<Int64>());
                    break;
                case "decimal":
                    p.SetValue(result, cell.GetValue<Decimal>());
                    break;
                case "double":
                    p.SetValue(result, cell.GetValue<Double>());
                    break;
                case "datetime":
                    p.SetValue(result, cell.GetValue<DateTime>());
                    break;
                case "boolean":
                    p.SetValue(result, cell.GetValue<Boolean>());
                    break;
                case "byte":
                    p.SetValue(result, cell.GetValue<Byte>());
                    break;
                case "char":
                    p.SetValue(result, cell.GetValue<Char>());
                    break;
                case "single":
                    p.SetValue(result, cell.GetValue<Single>());
                    break;
                default:
                    p.SetValue(result, cell.Value);
                    break;
            }
        }

        #endregion

        #region 获取Lambda的属性名称

        private static string GetPropertyName(Expression<Func<T, object>> expression)
        {
            Expression expressionToCheck = expression;
            bool done = false;
            while (!done)
            {
                switch (expressionToCheck.NodeType)
                {
                    case ExpressionType.Convert:
                        expressionToCheck = ((UnaryExpression)expressionToCheck).Operand;
                        break;
                    case ExpressionType.Lambda:
                        expressionToCheck = ((LambdaExpression)expressionToCheck).Body;
                        break;
                    case ExpressionType.MemberAccess:
                        var memberExpression = ((MemberExpression)expressionToCheck);
                        string propertyName = memberExpression.Member.Name;
                        return propertyName;
                    default:
                        done = true;
                        break;
                }
            }
            return "";
        }

        #endregion

    }

补充一个例子

http://files.cnblogs.com/ariklee/ExcelConvertEntity.rar

Epplus下的一个将Excel转换成List的范型帮助类

时间: 2024-10-03 14:45:25

Epplus下的一个将Excel转换成List的范型帮助类的相关文章

简单三步学会如何将excel转换成word

对于Excel和Word之间的转换问题,我们需要下载一款叫迅捷的PDF转换器,它可以帮我们解决这个问题.对于专业的事情就用该交给专业的软件来做,社会分工越来越精细化,时间就是金钱,语气自己浪费时间做笨功夫,不如用这个时间去做你擅长的有价值的事情,然后把这件事交给别人. 操作非常简单,只用三步就完成了:     1.首先下载安装迅捷PDF转换软件,双击打开软件,在软件左侧选择要转换的类型"文件转Word",然后点击上面的"添加文件"按钮,在弹出的界面上选择要转换的Ex

excel转换成pdf转换器哪个好

excel转换成pdf转换器哪个好?作为办公人员,不可避免的要接触到excel软件,对于一名计算机专业毕业的工作者来说,制作一份excel文件那是相当简单的事情,一般情况下不会出现任何的问题.但是,如果办公人员需要将多份excel文件转换成pdf文件,那又该怎么办呢?有这方面经历的工作者都知道,现在网络上有多款针对这方面问题的excel转换成pdf转换器,这无疑为用户添加了很多选择上的烦恼,现在问题来了,excel转换成pdf转换器哪个好? 说到excel转换成pdf转换器,很多用户不免会想到迅

excel转换成PDF在线转换工具

近期,迅捷技术小组发布了最新的在线版本,借助强大的云端服务器的全覆盖功能,在线版本的excel转换成PDF转换器有力保障了用户在线转换效果和质量. 在线excel转换成PDF转换器的简介: 迅捷在线excel转换成PDF软件是由国内知名的迅捷Excel转换成PDF转换器研发团队,在原增强版迅捷PDF转换器基础上,开发了最新的在线版Excel转换工具,接触互联网平台优势,打造了一个完全免费.无需注册.高质量Excel转换的平台. 迅捷在线Excel转换成PDF转换器的功能特点: 在线excel转P

让你相见恨晚的Excel转换成PDF技巧

日常工作中,总免不了要进行Excel表格扭转给他人,由于Excel格式或者office版本问题,导致Excel打开错误,或者空的,为了解决这样的问题,通常情况下,我们会将Excel转换成PDF,然后再进行扭转给他人,那么如何将Excel转换成PDF呢?推荐大家使用PDF在线编辑转换平台:pdf365,在线轻松一键转换. 打开PDF365网站首页,功能丰富,一目了然,点击"Excel转PDF"图标. 仅需3步即可快速将Excel转换成PDF 1. 在Excel转换成PDF页面上传Exce

Linux下将UTF8编码批量转换成GB2312编码的方法

Linux下将UTF8编码批量转换成GB2312编码的方法 在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换成GB2312编码,下面为大家介绍下在Linux下如何进行转换 UTF8编码和GB2312编码是有区别的,在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换 成GB2312编码,可是一个个的转换十分麻烦,下面小编就教你如何在Linux下将UTF8编码批量转换成GB2312编码. 背景 本人在使用oracl

.net excel 转换成datatable,创建文件夹

protected void Button9_Click(object sender, EventArgs e) { string path = ""; path = FileUpload3.PostedFile.FileName; if (path == "") { string jss = "<script language='javascript' type='text/javascript'> alert('先选择文件')</sc

几种不同的excel转换成pdf方式

在将一些表格文档进行互相传阅的时候,如果不想里面的内容被修改,那么可以将excel转换成pdf文件格式,这样既方便传输,也可以很好的保护文档内容.根据不同的情况,我们可以采用不同的方法将excel转换成pdf. excel表格内容较多的,可以通过excel转换成pdf转换器直接转换.打开转换工具,选择excel转pdf选项. 把需要转换的excel表格放到转换器中,选择文件的输出目录,然后点击开始转换按钮,当文件显示转换完成后就可以得到转换好pdf文件了. 对于不大的excel表格,可以不用软件

excel转换成pdf的方法

说到excel文件,大家肯定就想起各种表格数据,作为微软办公套装软件的重要的组成部分,excel可以进行各种数据的处理.统计分析和辅助决策操作,广泛地应用于管理.统计财经.金融等众多领域,所以在工作中,大家经常会遇到各种excel文件,有时候因为工作方面的要求,大家需要将excel文件转换成易阅读但不容易修改的pdf文件,可是,如何把excel转成pdf呢?今天小猪在这里向大家简单的讲一下关于excel转换成pdf的方法. 首先确定一点的就是:想要将excel转换成pdf免不了要使用pdf转换器

可以将excel转换成pdf么?

是否大家有过同样的感触:我们在做Excel报表的时候可能需要把报表换成他人编辑不了的文档,该怎么办呢?此时仅需将Excel转换成PDF,怎么转换呢?笔者今天与大家一同分享一下. 推荐五星软件:迅捷Excel转换成PDF转换器 这是一款PDF 转多种格式的软件,左侧蓝色部分是你要转换输出的格式,你要什么格式就选择什么格式,前提是你一定要安装微软的OFFICE办公软件. 具体方法是:在Excel转换成PDF转换器重点击“Excel转PDF”(这里以Excel转PDF为例),在留意左下方“添加文件”选