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, 校验失败的话 ...
随机推荐
- Windows系统下硬盘S.M.A.R.T硬盘检测工具——硬盘检测工具(CrystalDiskInfo)
CrystalDiskInfo是由日本人hiyohiyo个人开发的小工具,能全面详细直观的检查硬盘的健康状态及各种参数. 绿色版软件. 官方下载地址: https://crystalmark.info ...
- Apache DolphinScheduler 支持使用 OceanBase 作为元数据库啦!
DolphinScheduler是一个开源的分布式任务调度系统,拥有分布式架构.多任务类型.可视化操作.分布式调度和高可用等特性,适用于大规模分布式任务调度的场景.目前DolphinScheduler ...
- 3d格式介绍之OBJ格式
OBJ格式是一种用于3D模型的文件格式,全称为Wavefront OBJ.它由Wavefront Technologies公司开发,最初用于其高级视觉动画软件,但后来广泛应用于各种3D图形软件中. 本 ...
- Https通信的SSL证书工作流程原理(转)
前言 浏览器与服务器之间的https加密通信会包括以下一些概念:非对称加密.对称加密.RSA.证书申请.根证书.https证书加密,就是在传输层tcp和应用层http之间加了一层ssl层来对传输内容进 ...
- 以MySQL为例,来看看maven-shade-plugin如何解决多版本驱动共存的问题?
开心一刻 清明节那天,看到一小孩在路边烧纸时不时地偷偷往火堆里扔几张考试卷子边烧边念叨:爷爷呀,你岁数大了,在那边多做做题吧,对脑子好,要是有不懂的地方,就把我老师带走,让他教您! 前提说明 假设 M ...
- CentOS 7 yum无法使用解决方法Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=
在centos7中使用yum命令时候报错: Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http: ...
- k8s 知识
命令 Pod 管理 kubectl get pods 查看pod在哪个node上 kubectl get pods -o wide kubectl describe pod pod_name 创建新的 ...
- 使用 nuxi info 查看 Nuxt 项目详细信息
title: 使用 nuxi info 查看 Nuxt 项目详细信息 date: 2024/9/5 updated: 2024/9/5 author: cmdragon excerpt: 摘要:文章介 ...
- 事务发件箱模式在 .NET 云原生开发中的应用(基于Aspire)
原文:Transactional Outbox in .NET Cloud Native Development via Aspire 作者:Oleksii Nikiforov 总览 这篇文章提供了使 ...
- Splay/LCT 学习笔记
唔,其实我不会 Splay,但是我会 LCT. 众所周知,会 LCT 和会 Splay 是两回事,因为 LCT 只需要旋至根即可. 到现在还是不会,但是先把 LCT 的 Splay 写一下吧. 自己复 ...