npoi2.3+泛型+反射 根据配置统一解析excel数据到实体的基础方法
解析方法:
/// <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数据到实体的基础方法的更多相关文章
- oracle xmltype导入并解析Excel数据--前言
通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...
- 解析Excel数据
解析Excel数据常用的方式就是使用POI和JXL工具了,这两种工具使用起来有些类似,这里记录一下使用方式提供个参考 POI使用 File file = new File(filePath); Fil ...
- POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)
实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...
- oracle xmltype导入并解析Excel数据 (四)特别说明
1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...
- oracle xmltype导入并解析Excel数据 (三)解析Excel数据
包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...
- oracle xmltype导入并解析Excel数据 (一)创建表与序
表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...
- 使用python三方库xlrd解析excel数据
excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...
- SpingBoot解析Excel数据
前言 在最近的工作中,由于导入模板除了前三列(姓名.手机号.实发工资)固定:其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理. 一.数据模板数据展示: (1)模板一 (2)模板 ...
- oracle xmltype导入并解析Excel数据 (五)中间表数据入库
此处给出例子,具体根据业务需求 create or replace procedure P_CART_Sheet1(p_id in NUMBER) is--车辆管理功能v_str varchar2(4 ...
- oracle xmltype导入并解析Excel数据 (二)规则说明
规则表字段说明如下: 其中RULE_FUNC_CUSTOMIZE表示,用户自己写函数,去判断数据是否合法,存储的是函数的名字 此函数的参数只有一个,该列的值,字段类型是Varchar2, 校验失败的话 ...
随机推荐
- Correct the classpath of your application so that it contains a single, compatible version of xxx报错解决
1.背景 有时候引入包有冲突,比如在Maven项目中的不同模块多次重复引入等 这里遇到的问题是重复映入了如下包: <dependency> <groupId>com.baomi ...
- dubbo序列化问题(二)hession2与kryo切换
转
dubbo提供了好几种序列化方式,一般我们都是用的是默认的hession2,而dubbox为我们增加了kryo和fst许了方式,主要体现在速度快,占用内存小,然后我们将序列化配置改为是用kryo: & ...
- 瑞芯微 | 摄像头ov13850移植笔记
<1.瑞芯微rk356x板子快速上手> <2.Linux驱动|瑞芯微rtc-hym8563移植笔记> <3.Linux驱动 | Linux内核 RTC时间架构-基于瑞芯微 ...
- 华为交换机S5700-52C-EI开启telnet服务
华为S5700交换机初始化和配置TELNET远程登录方法: 1,交换机开启Telnet服务 <Quidway>system-view #进入系统视图 [Quidway]telnet ser ...
- WPF 模仿前端大佬写一个Hover效果
先看一下效果吧: 原博主的地址:[动画进阶]神奇的卡片 Hover 效果与 Blur 的特性探究 - ChokCoco - 博客园 (cnblogs.com) 原效果是一个css效果,我们采用WPF的 ...
- 【Mac + Appium + Java1.8(三)】之IOS自动化环境安装配置以及简单测试用例编写(模拟器、真机)
前提条件: =========================================== 1.Xcode版本为Xcode10及以上2.Appium版本必须为1.9及以上,因为Xcode为10 ...
- WebShell流量特征检测_中国菜刀篇
80后用菜刀,90后用蚁剑,95后用冰蝎和哥斯拉,以phpshell连接为例,本文主要是对这四款经典的webshell管理工具进行流量分析和检测. 什么是一句话木马? 1.定义 顾名思义就是执行恶意指 ...
- 游戏AI行为决策——GOAP(目标导向型行动规划)
游戏AI行为决策--GOAP(附代码与项目) 新的一年即将到来,感觉还剩一种常见的游戏AI决策方法不讲的话,有些过意不去.就在这年的尾巴与大家一起交流下「目标导向型行为规划(GOAP)」吧! 另外,我 ...
- vue源码解析-实现一个基础的MVVM框架
基本介绍 vue.js采用数据劫持结合发布-订阅模式的方式,通过Object.defineProperty()来劫持各个属性的getter,setter,在数据变动时发布消息给订阅者,触发响应的监听回 ...
- 小tips:ECMA-262定义的7种错误类型
七种错误类型如下: Error EvalError RangeError ReferenceError SyntaxError TypeError URIError 其中,Error是基类型(其他六种 ...