解析方法:

        /// <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; }
}

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

  1. oracle xmltype导入并解析Excel数据--前言

    通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...

  2. 解析Excel数据

    解析Excel数据常用的方式就是使用POI和JXL工具了,这两种工具使用起来有些类似,这里记录一下使用方式提供个参考 POI使用 File file = new File(filePath); Fil ...

  3. POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)

    实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...

  4. oracle xmltype导入并解析Excel数据 (四)特别说明

    1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...

  5. oracle xmltype导入并解析Excel数据 (三)解析Excel数据

    包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...

  6. oracle xmltype导入并解析Excel数据 (一)创建表与序

    表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...

  7. 使用python三方库xlrd解析excel数据

    excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...

  8. SpingBoot解析Excel数据

    前言 在最近的工作中,由于导入模板除了前三列(姓名.手机号.实发工资)固定:其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理. 一.数据模板数据展示: (1)模板一 (2)模板 ...

  9. oracle xmltype导入并解析Excel数据 (五)中间表数据入库

    此处给出例子,具体根据业务需求 create or replace procedure P_CART_Sheet1(p_id in NUMBER) is--车辆管理功能v_str varchar2(4 ...

  10. oracle xmltype导入并解析Excel数据 (二)规则说明

    规则表字段说明如下: 其中RULE_FUNC_CUSTOMIZE表示,用户自己写函数,去判断数据是否合法,存储的是函数的名字 此函数的参数只有一个,该列的值,字段类型是Varchar2, 校验失败的话 ...

随机推荐

  1. [COCI 2023/2024 #1] Mostovi 题解

    前言 题目链接:洛谷. 题目分析 首先可以确定的是需要枚举断边,所以我们希望两次枚举之间能有些关联.不难想到类树形 DP 的套路,建 DFS 树,只不过这题除了讨论和父亲之间的边,还要考虑返租边.以下 ...

  2. Apache DolphinScheduler 3.2.2 版本正式发布!

    Apache DolphinScheduler 3.2.2 版本正式发布! 近日,Apache DolphinScheduler 发布了 3.2.2 版本.此版本主要基于 3.2.1 版本进行了 bu ...

  3. 手把手教你实现Scrapy-Redis分布式爬虫:从配置到最终运行的实战指南

    ## 1.scrapy-redis的环境准备 pip install scrapy-redis 安装完毕之后确保其可以正常导入使用即可. 2. 实现 接下来我们只需要简单的几步操作就可以实现分布式爬虫 ...

  4. 如何用C语言操作sqlite3,一文搞懂

    sqlite3编程接口非常多,对于初学者来说,我们暂时只需要掌握常用的几个函数,其他函数自然就知道如何使用了. 数据库 本篇假设数据库为my.db,有数据表student. no name score ...

  5. .NET 网络唤醒

    本文介绍下电脑设备关机的情况下如何通过网络唤醒设备,之前电源S状态 计算机Power电源状态- 唐宋元明清2188 - 博客园 (cnblogs.com) 有介绍过远程唤醒设备,后面这俩天了解多了点所 ...

  6. Redis 入门 - 五大基础类型及其指令学习

    经过前面Redis入门系列三篇文章学习,相信大家已经准备好学习新知识了,到这里也算是真正开始学习Redis了.学习了软件安装,客户端选择,那么接下来也应该来了解Redis有什么,能干什么. 我们在第一 ...

  7. A股迎来中报季,合合信息文档解析技术辅助大模型深度解读财报

    财务报告是公众和投资者了解企业经营状况的主要信源之一.步入8月中下旬,上市公司进入了中报披露高峰期.据东方财富Choice数据统计,截至8月14日数据,A股有超过1715只个股公布了2024年半年度业 ...

  8. ST-SSL: 用于交通流量预测的时空自监督学习《Spatio-Temporal Self-Supervised Learning for Traffic Flow Prediction》(交通流量预测、时空异质性、自监督、数据增强)

    2023年10月23日,继续论文,好困,想发疯. 论文:Spatio-Temporal Self-Supervised Learning for Traffic Flow Prediction Git ...

  9. Angular 学习笔记 language service

    尝试 v10 rc 的时候, 突然 language service 不 work 了. ctrl + shift + p -> Show logs... 这样可以检查和 report issu ...

  10. Hadoop & Redis未授权漏洞实战——Vulfocus服务攻防

    什么是未授权访问漏洞?Hadoop & Redis靶场实战--Vulfocus服务攻防 一.介绍 未授权访问,也称为未经授权的访问或非法访问,是指在没有得到适当权限或授权的情况下,个人或系统访 ...