npoi2.3+泛型+反射根据配置统一解析excel数据到实体的基础方法

author author     2022-09-16     639

关键词:

解析方法:

        /// <summary>
        /// excel数据解析到实体
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="sheet">npoi读取到的excel工作表,需要解析的工作表</param>
        /// <param name="startRowIndex">从第几行开始解析 从1开始</param>
        /// <param name="relations">excel和实体的对应关系</param>
        /// <param name="msg">可能存在的错误提示</param>
        /// <returns>实体数据</returns>
        public List<T> Parse<T>(ISheet sheet, int startRowIndex, List<SheetToEntityAttrRelation> relations, out string msg)
        {
            msg = "";
            if (relations == null || relations.Count <= 0)
            {
                msg += "没有excel列名与实体属性的对应关系;";
                return null;
            }
            if (sheet == null)
            {
                msg += "sheet为空;";
                return null;
            }
            List<T> list = new List<T>();
            int rows = sheet.LastRowNum; //行数
            PropertyInfo[] props = typeof(T).GetProperties();
            if (props == null || props.Count() <= 0)
            {
                msg += "类型T的对象中没有属性;";
                return null;
            }
            //逐行读取sheet中的行
            for (int i = startRowIndex - 1; i <= rows; i++)
            {
                var row = sheet.GetRow(i);  //GetRow序号是从0开始的
                if (row == null) continue;
                T obj = (T)Activator.CreateInstance(typeof(T));
                list.Add(obj);
                foreach (SheetToEntityAttrRelation r in relations)
                {
                    //检查配置关系中的属性名在实体中是否存在
                    var currProps = props.Where(e => e.Name.Equals(r.AttrName));
                    if (currProps == null || currProps.Count() <= 0)
                    {
                        msg += "类型T的对象中没有属性:" + r.AttrName + ";";
                        continue;
                    }
                    PropertyInfo prop = currProps.ToList()[0];
                    string data = GetCellValue(row.GetCell(r.ColumnIndex - 1)); //GetCell序号是从为开始的
                    if (!string.IsNullOrEmpty(data))
                    {
                        switch (r.DataType)
                        {
                            case DbType.AnsiString: prop.SetValue(obj, data, null); break;
                            case DbType.Double: prop.SetValue(obj, Convert.ToDouble(data), null); break;
                            case DbType.Int32: prop.SetValue(obj, Convert.ToInt32(data), null); break;
                            case DbType.DateTime:
                                if (string.IsNullOrEmpty(r.TimeFormat)) r.TimeFormat = "yyyyMmdd";
                                DateTime dt;
                                if (DateTime.TryParseExact(data, r.TimeFormat, null, DateTimeStyles.None, out dt))
                                {
                                    prop.SetValue(obj, dt, null);
                                }
                                else
                                {
                                    msg += string.Format("第{0}行第{1}列不是有效的日期格式数据", i + 1, r.ColumnIndex);
                                    continue;
                                }
                                break;
                        }
                    }
                    else
                    {
                        msg += string.Format("第{0}行第{1}数据为空", i + 1, r.ColumnIndex);
                        continue;
                    }
                }
            }
            return list;
        }

        private string GetCellValue(ICell cell)
        {
            string value = "";
            if (cell != null)
            {
                if (cell.CellType.Equals(CellType.String))
                {
                    value = cell.StringCellValue;
                }
                if (cell.CellType.Equals(CellType.Numeric))
                {
                    value = cell.NumericCellValue.ToString();
                }
                if (cell.CellType.Equals(CellType.Boolean))
                {
                    value = cell.BooleanCellValue.ToString();
                }
            }
            return value;
        }

参数中定义的类型:

    /// <summary>
    /// excel工作表字段名与实体字段对应关系
    /// </summary>
    public class SheetToEntityAttrRelation
    {
        /// <summary>
        /// excel列序号,第一列从1开始
        /// </summary>
        public int ColumnIndex { get; set; }
        /// <summary>
        /// 实体属性名
        /// </summary>
        public string AttrName { get; set; }
        /// <summary>
        /// 数据类型:允许string,int32,double,datetime
        /// </summary>
        public DbType DataType { get; set; }

        /// <summary>
        /// 如果数据类型为日期时间,将字符串转为日期时需要指定日期格式:yyyyMMdd,yyyy-MM-dd,yyyyMMddHHmmss,yyyy-MM-dd HH:mm:ss
        /// </summary>
        public string TimeFormat { get; set; }
    }

 

[java基础]反射练习之越过泛型检查,运行配置文件制定内容(代码片段)

代码如下:packageReflectTest01;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.ArrayList;publicclassReflectTest01publicstaticvoidmain(String[]args)throwsNo 查看详情

反射和泛型的复习

反射在框架的设计中很多都用到了反射,比如spring中我们在applicationContext.xml中配置类,通过反射+工厂模式得到类的实例,就可以操作类了——操作一个类可以分为操作属性,构造方法,普通方法。反射的原理我们编写的Ja... 查看详情

spring组件spring是如何解析泛型-resolvalbetype

Spring组件(一)Spring是如何解析泛型-ResolvalbeTypeSpring系列目录(https://www.cnblogs.com/binarylei/p/10117436.html)JavaType泛型系列文章:Java-Type介绍Java-Type的获取方式Spring-ResolvableTypeSpring中大量使用反射,需要获取泛型的具体类型,为此专门... 查看详情

在泛型方法中返回特定类型,具体取决于运行时没有反射或动态的枚举值

】在泛型方法中返回特定类型,具体取决于运行时没有反射或动态的枚举值【英文标题】:ReturnspecifictypeingenericmethoddependingonenumvaluewithoutReflectionordynamicduringruntime【发布时间】:2021-12-2817:17:18【问题描述】:我有一个非泛型IList... 查看详情

java筑基.泛型,反射,注解-利用注解加反射练习(代码片段)

文章目录泛型:泛型类泛型方法泛型接口子类明确泛型类的类型参数变量子类不明确泛型类的类型参数变量限定类型变量通配符泛型注解元注解注解的应用场景反射:注解+反射练习泛型:把类型明确的工作推迟到创建对象或调用... 查看详情

在 Swift 中使用泛型、协议和继承创建对象时的 EXC_BAD_ACCESS

】在Swift中使用泛型、协议和继承创建对象时的EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESSwhencreatinganobjectwithGenerics,ProtocolsandInheritanceinSwift【发布时间】:2015-01-1616:57:34【问题描述】:此代码生成EXC_BAD_ACCESS(即使在操场上)。(我简... 查看详情

反射泛型

对泛型进行反射:packagecom.zby;importjava.io.Closeable;importjava.io.InputStream;importjava.lang.reflect.Field;importjava.lang.reflect.GenericArrayType;importjava.lang.reflect.Method;importjava.lang.reflect.P 查看详情

反射入门-浅谈反射用途_根据ado游标对象创建list集合

...什么用,一时之间也想不到什么更好的例子,就写了个根据泛型类型和游标反射创建List集合的Demo.首先创建一个用于封装对应数据的entity,代码如下.usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.T 查看详情

泛型与反射:type接口来历及子接口(代码片段)

泛型出现之前的类型没有泛型的时候,只有原始类型。此时,所有的原始类型都通过字节码文件类Class类进行抽象。Class类的一个具体对象就代表一个指定的原始类型。泛型出现之后的类型泛型是对类的抽象,泛型出... 查看详情

泛型反射和异常

JavaSE(十一)--泛型、反射和异常一、泛型泛型是javaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型... 查看详情

java-反射-暴力反射和泛型擦除

JAVA-反射-暴力反射和泛型擦除暴力反射定义在类中的某些成员变量或成员方法是私有的,这显然不希望我们显式使用,但是Java还是为我们提供了一个方法用来"暴力"的使用这些私有属性或方法。Java中提供getDeclaredField()、g... 查看详情

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质importjava.lang.reflect.Method;importjava.util.ArrayList;/***通过反射了解集合泛型的本质*@authorshm**/publicclassMethodDemo02{ publicstaticvoidmain(String[]args){ ArrayListlist=newArrayList(); list.a 查看详情

反射获取泛型信息(代码片段)

获取泛型信息反射操作泛型代码练习importcom.exception.demo01.Test;importjava.lang.reflect.Method;importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;importjava.util.List;importjava.util.Map;//通过反射获取泛 查看详情

31反射(获取class实例剖析运行时类的完整结构读取properties文件反射创建类越过泛型检查)枚举(代码片段)

...orFieldMethod父类、接口、包4、反射的应用Properties配置文件泛型枚举1、枚举类的使用反射1、Java反射机制概述反射机制允许程序在执行期通过ReflectionAPI取得任何类的内部信息,并能直接操作任何对象的内部属性和方法;加载完类... 查看详情

java泛型反射机制

/****@authorAdministrator*功能:泛型的必要性(参数化类型)(安全简单)*/packagecom.test;importjava.util.*;publicclassTest{/***@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstub//ArrayListal=newAr 查看详情

泛型与反射

泛型方法:你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。下面是定义泛型方法的规则:所有泛型方法声明都有一个类型参数声明部分(... 查看详情

泛型反射

泛型概述:通用的类型<>: typeof<T>:T,叫做参数类型变量<String>:String,实际类型参数List<String> :整体叫做参数化类型 获取实现的接口或继承的类上的参数化类型的API:Type[]getGenericInterfaces();:获得带有泛型的... 查看详情

使用反射为泛型类创建构造函数

】使用反射为泛型类创建构造函数【英文标题】:Createconstructorforgenericclassusingreflection【发布时间】:2011-12-0416:14:16【问题描述】:我想为泛型类创建一个使用反射的类。谁能告诉我如何创建它?我有publicclassSomeClass<T>....我... 查看详情