解析方法:

        /// <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. PyTorch的TensorBoard用法示例

    原文: https://www.emperinter.info/2020/07/30/tensorboard-in-pytorch/ 缘由 自己上次安装好PyTorch以及训练了一下官方的数据,今天看 ...

  2. 疫情远程办公Citrix XenDesktop 2203长期稳定版本虚拟云桌面部署教程

    下面列出来的是目录大纲,里面包含了Citrix完整搭建的教程,此次实验环境是利用Citrix XenDesktop 7.15 CU3长期稳定版虚拟桌面详细安装教程, 含PVS及UPM相关配置,期待视频 ...

  3. devops-3:Jenkins增加静态节点

    Jenkins管理静态节点 Jenkins搭建完成后一般只有一个master节点,此节点主要用于管理Jenkins配置,如果再在master节点上跑一系列的Job,未免有点太勉强,并且如果出现资源紧缺 ...

  4. Python新手爬虫二:爬取搜狗图片(动态)

    经过上一期爬取豆瓣影评成功后,感觉爬虫还不错,于是想爬点图片来玩玩... 搜狗图片地址:https://pic.sogou.com/?from=category 先上最后成功的源码(在D盘下创建sou ...

  5. SpringBoot 引入 WebSocket

    maven 添加websocket ,按照一篇博文引入 websocket https://www.cnblogs.com/likun10579/p/5450209.html 在浏览器控制台测试是否连 ...

  6. 【YashanDB知识库】开源调度框架Quartz写入Boolean值到YashanDB报错

    问题现象 Quartz 是一个广泛应用于企业级应用中的开源作业调度框架,它主要用于在Java环境中管理和执行任务. 为了任务调度,Quartz的数据模型中使用了大量的布尔值记录任务.流程的各种状态,如 ...

  7. MOGA-Net: 多目标遗传算法求解复杂网络中的社区《A Multiobjective Genetic Algorithm to Find Communities in Complex Networks》(遗传算法、多目标优化算法、帕累托最优)

    论文:A Multiobjective Genetic Algorithm to Find Communities in Complex Networks GitHub: IEEE 2012的论文. ...

  8. Angular 18+ 高级教程 – Coding Style Guide 编码风格

    前言 Angular 从 v14 开始大改特改,改最多的就是编码风格. 以前是 class first,Decorator first,mutable first. 现在变成了 function fi ...

  9. Angular Material 18+ 高级教程 – CDK Overlay

    Overlay, Dialog, Modal, Popover 傻傻分不清楚 参考: Medium – Modal?Dialog?你真的知道他們是什麼嗎? Popups, dialogs, toolt ...

  10. Facebook Ads – 笔记

    前言 记入一些小东西 参考 YouTube – 这是第一次广告投放回报做到11倍!Facebook广告高广告投资回报2023年终极策略密码分享 价值阶梯 先卖便宜 value 低的东西给客户,甚至免费 ...