我是一名 ASP.NET 程序员,专注于 B/S 项目开发。累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html

网上有很多关于npoi读取excel表格的例子,很多都是返回一个Datatable的对象,但是我需要的是一个list集合,这里就需要把Datatable转成自己需要的List集合,所以,我封装了一个方法,传入class对象就能返回相应的list对象。

首先先看效果图,如下:

模板

一共有4列,有很多行,其中只有2行有数据,如下图:

特性

首先,定义一个特性,意义是对象的属性对应表格的哪一列,代码如下:

public class ColumnAttribute: Attribute
{
public ColumnAttribute(int index)
{
Index = index;
}
public int Index { get; set; }
}

  

对象模型

将表格数据读取出来,转换成相应的对象集合,在对象的属性标注上面定义的特性,代码如下:

public class TestModel
{
[Column(0)]
public string Name { get; set; }
[Column(1)]
public string Url { get; set; }
[Column(2)]
public string Date { get; set; }
[Column(3)]
public string Remark { get; set; }
}

  

封装的方法

nuget安装npoi:

Install-Package DotNetCore.NPOI -Version 1.2.2

代码如下:

public class ExcelHelper
{
/// <summary>
/// 读取excel转换成list集合
/// </summary>
/// <typeparam name="T">对象</typeparam>
/// <param name="stream">文件流</param>
/// <param name="startIndex">从第几行开始读取</param>
/// <param name="sheetIndex">读取第几个sheet</param>
/// <returns></returns>
public static IList<T> GetList<T>(Stream stream, int startIndex, int sheetIndex = 0)
where T : class
{
IList<T> ts = new List<T>();
try
{
IWorkbook workbook = WorkbookFactory.Create(stream);
var sheet = workbook.GetSheetAt(sheetIndex);
if (sheet != null)
{
IRow firstRow = sheet.GetRow(0);
//一行最后一个cell的编号 即总的列数
int cellCount = firstRow.LastCellNum;
//最后一列的标号
int rowCount = sheet.LastRowNum;
for (int i = startIndex; i <= rowCount; ++i)
{
//获取行的数据
IRow row = sheet.GetRow(i);
if (row == null) continue; //没有数据的行默认是null       
{
T model = Activator.CreateInstance<T>();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
if (row.GetCell(j) != null)
{
var rowTemp = row.GetCell(j);
string value = null;
if (rowTemp.CellType == CellType.Numeric)
{
short format = rowTemp.CellStyle.DataFormat;
if (format == 14 || format == 31 || format == 57 || format == 58 || format == 20)
value = rowTemp.DateCellValue.ToString("yyyy-MM-dd");
else
value = rowTemp.NumericCellValue.ToString();
}
else
value = rowTemp.ToString();
//赋值
foreach (System.Reflection.PropertyInfo item in typeof(T).GetProperties())
{
var column = item.GetCustomAttributes(true).First(x => x is ColumnAttribute) as ColumnAttribute;
if (column.Index == j)
{
item.SetValue(model, value);
break;
}
}
}
}
ts.Add(model);
}
}
}
}
catch (Exception)
{
throw;
}
finally
{
if (stream != null) stream.Close();
}
return ts;
}
}

  

调用代码:

static void Main(string[] args)
{ FileStream fs = new FileStream(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "/test.xlsx", FileMode.Open, FileAccess.Read);
var temp = ExcelHelper.GetList<TestModel>(fs, 3);
var json1 = Newtonsoft.Json.JsonConvert.SerializeObject(temp.Where(x => !string.IsNullOrWhiteSpace(x.Name)).ToList());
Console.WriteLine(json1);
Console.WriteLine("ok");
Console.ReadKey();
}

  最后,就出现了文章最开始的效果图。

转载于:https://down.itsvse.com/k/0tmhog.html

.NET Core 使用NPOI读取Excel返回泛型List集合的更多相关文章

  1. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  2. 使用NPOI读取Excel数据到DataTable

    如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...

  3. NPOI读取Excel帮助类,支持xls与xlsx,实现公式解析,空行的处理

    NPOI读取Excel(2003或者2010)返回DataTable.支持公式解析,空行处理. /// <summary>读取excel /// 默认第一行为表头 /// </sum ...

  4. NPOI读取Excel表格类

    public class NPOIHelper    {        private HSSFWorkbook workbook;        public static IWorkbook Lo ...

  5. 使用NPOI读取Excel数据并写入SQLite

    首先,我们来建一个数据库,我们就叫Hello.db(不一定是db后缀,你可以sqlite,sqlite3,db3)都可以作为识别,然后往里面建一个空的表格,如下图所示 然后建一个Excel表格,往表格 ...

  6. NPOI读取Excel遇到的坑

    NPOI是POI的.NET版本.POI是用Java写成的库,能帮助用户在没有安装Office环境下读取Office2003-2007文件.NPOI在.NET环境下使用,能读写Excel/Word文件. ...

  7. 使用NPOI读取Excel出错

    使用NPOI读取Excel出错,错误信息:java.io.IOException: Invalid header signature; read 4503608217567241, expected ...

  8. asp.net 使用NPOI读取excel文件

    asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...

  9. 使用NPOI读取Excel表格内容并进行修改

    前言 网上使用NPOI读取Excel文件的例子现在也不少,本文就是参考网上大神们的例子进行修改以适应自己需求的. 参考博文 http://www.cnblogs.com/restran/p/38894 ...

随机推荐

  1. Python读写Excel文件的实例

    最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理.首先贴出网上找来的读写Excel的脚本. 1.读取Excel(需要安装xlrd) ...

  2. 使用CAD快速看图如何将图纸打印和预览?

    有相关CAD工作经验的小伙伴们都知道,绘制完CAD图纸后是需要借助CAD看图工具来进行查看图纸的,其实CAD快速看图中不仅能够对图纸进行查看,还能够将CAD图纸进行打印出来.但是有很多的伙伴不知道要怎 ...

  3. vue-cli3和element做一个简单的登陆页面

    1.先用vue-cli3创建一个项目 2.安装element模块 全局安装 npm i element-ui -S 3在main.js引入模块 import ElementUI from 'eleme ...

  4. bacula备份工具

    源码下载:http://www.bacula.org bacula适合数据业务量巨大,每天都在迅速增长,还需要以tar打包方式进行低级备份而且没有异地容灾策略.Bacula是一个完美的增量备份功能,同 ...

  5. 剑指offer 20:顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  6. 【XML】XML基本结构以及XML-Schema约束

    XML 简介 1998年2月,W3C正式批准了可扩展标记语言的标准定义,可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发.可 ...

  7. mssql sqlserver 使用sql脚本实现相邻两条数据相减的方法分享

    摘要: 下文讲述使用sql脚本实现相邻两条数据相减的方法,如下所示: 实验环境:sql server 2008 R2 实现思路: 1.使用cte表达式,对当前表进行重新编号 2.使用左连接对 表达式 ...

  8. 免密码登录postgresql

    如果在当前shell 下,如果设定 export PGPASSWORD='postgres密码' 环境变量,可以不用每次执行sql 语句或者导入一个sql 文件都输入一次密码的麻烦了.

  9. firefox56 版本中的 Selenium IDE 无法导出脚本问题

    firefox:56 Slenium IDE :3系列 问题:Selenium IDE 没有工具栏,无法导出录制的脚本,这给自动化测试工作带来了极大的不便. 解决办法:将firefox 降级 (只有5 ...

  10. (导航页)Amazon Lightsail 部署LAMP应用程序(HA)

    Amazon Lightsail 简介: Amazon Lightsail是一个具有易于使用的界面,具有成本效益,快速和可靠的云平台.它是更简单的工作负载,快速部署以及Amazon Web Servi ...