解析方法:

        /// <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. baselines算法库baselines/bench/monitor.py模块分析

    baselines算法库baselines/bench/monitor.py模块代码: __all__ = ['Monitor', 'get_monitor_files', 'load_results ...

  2. gym库中类FilterObservation(ObservationWrapper)的理解

    filter_observation.py模块中类 FilterObservation(ObservationWrapper) 的理解. 代码: import copy from gym import ...

  3. Python示例——负数的位运算

    平时在coding的时候虽然会遇到位运算但一般也都是正数的位运算,今天突然见到了使用负数的位运算,对此十分好奇和困惑,为此做了下了解,于是有了此文. 给出一些位运算的例子: 其中,正数的位运算是最为常 ...

  4. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-63 - Canvas和SVG元素定位

    1.简介 今天宏哥分享的在实际测试工作中很少遇到,比较生僻,如果突然遇到我们可能会脑大.懵逼,一时之间不知道怎么办?所以宏哥这里提供一种思路供大家学习和参考. 2.SVG简介 svg也是html5新增 ...

  5. CF208E 题解

    Blood Cousins 前置知识:线段树合并. 我们先把题目转化一下.这里先设 \(v\) 的 \(p\) 级祖先为 \(u\),事实上要求的东西就是 \(u\) 的 \(p\) 级后代的个数减 ...

  6. 电脑打不开CHM格式文件解决办法

    如图所示 比如说jdk1.8的api 双击打开后,这个样子 就ok了

  7. .NET MAUI 里,为什么 FlexLayout 这么难用?

    管中窥豹,可见一斑 Layout: FlexLayout:

  8. Java Swing Loading转圈的进度提示框

    Java Swing Loading转圈的进度提示框 具体只需要两个类 AnimatedPanel.java InfiniteProgressPanel.java 前因:我们开发的web应用,有个奇葩 ...

  9. failed to copy: httpReadSeeker: failed open: unexpected status code xxx 403

    ack上pull镜像的时候,报的错 非运行脚本的问题,由负责ack相关设定的人员调整即可

  10. VUE-局部使用

    目录 VUE-局部使用 快速入门 常用指令 v-for v-bind v-if & v-show v-on v-model vue生命周期 Axios Vue案例 VUE-局部使用 Vue 是 ...