基于EPPlus和NPOI实现的Excel导入导出
基于EPPlus和NPOI实现的Excel导入导出
CollapseNav.Net.Tool.Excel(NuGet地址)
太长不看
- 导入
- excel 文件流将会转为
ExcelTestDto
类型的集合 var config = new ReadConfig<ExcelTestDto>()
.Default(item => item.Field0, "233")
.Require("Field1", item => item.Field1)
.Add("Field3", item => item.Field3);
IEnumerable<ExcelTestDto> data = await config.EPPlusExcelToEntityAsync(excelStream);
- excel 文件流将会转为
- 导出
ExcelTestDto
类型的集合将会转为 excel 文件流var config = new ExportConfig<ExcelTestDto>(datas);
.Add("Field0", item => item.Field0)
.Add("Field1", item => item.Field1)
.Add("Field2", item => item.Field2 ? "Male" : "Female")
.Add("Field3", item => item.Field3);
Stream stream = await exportConfig.EPPlusExportAsync();
简单的使用方式就是上面那样, 至少在我需要的使用场景下是work的
NuGet包在上面
前言
为了方便自己处理一些有关 excel 的导入导出功能, 所以花了更长时间做了这个包
主要是我觉得计算各个未知的下标位置, 计算那些 0 1 2 3 4 5 实在是太麻烦
而且每换一个模板就要再搞一次, 可读性巨差
我想摆脱这样的地狱, 然后奋力挣扎了几下
思路可以看一下之前的文章
本章就讲怎么用这个包
Excel Data
使用的表格数据Demo, 暂时只能处理单行表头的简单excel
Field0 | Field1 | Field2 | Field3 |
---|---|---|---|
233 | 23 | Male | 233.33 |
1122 | 12 | Female | 123.23 |
233 | 23 | Male | 233.33 |
1122 | 12 | Female | 123.23 |
... | ... | ... | ... |
How To Use
导入(Import/Read/...)
在 我碰到的使用场景中, 一般需要将Excel的数据转为系统中的某个实体
比如导入一个商品列表Excel,将这个列表转为 Goods
对象, 然后使用现成的 AddRange(IEnumerable<Goods> datas)
方法存到数据库中
基于以上这种 Excel-->Entitys
的使用场景设计了这一套东西
性能怎么样我就没测试了, 可能很拉了
假设我的实体长这样
public class ExcelTestDto
{
public string Field0 { get; set; }
public int Field1 { get; set; }
public bool Field2 { get; set; }
public double Field3 { get; set; }
}
1.BuildReadConfig
第一步先创建一个 ReadConfig
作为excel的读取配置
var config = new ReadConfig<ExcelTestDto>();
这个配置决定了之后将以什么方式读取哪些列
2.AddCellOptions
有了 ReadConfig
之后就需要添加具体的配置了
暂时提供了 Default
Require
Add
添加对 单个实体字段 的读取设置
Default
- 不依赖表格数据,对
ExcelTestDto
中的属性统一添加默认值 config.Default(item => item.Field0, "233");
- 不依赖表格数据,对
Require
- 被 Require 的单元格不可为空, 否则在读取时会主动抛出异常
config.Require("Field1", item => item.Field1);
Add
- 普通的添加单元格设置, 相对来说更加灵活一些
config.Add("Field3", item => item.Field3)
所有的excel单元格都会被读成 string
Require
Add
都可以使用 Func<string, object>
委托自定义对读取单元格的处理
由于是委托, 你可以做很多操作, 但比较容易影响性能, 最好不要写复杂的耗时的委托
config.Add("Field1", item => item.Field1, item =>
{
var numCellData = int.Parse(item);
numCellData += 2333;
return numCellData;
});
以上操作都会返回 ReadConfig
, 所以 强烈推荐 写成以下的调用
var config = new ReadConfig<ExcelTestDto>()
.Default(item => item.Field0, "233")
.Require("Field1", item => item.Field1)
.Add("Field3", item => item.Field3)
;
同时提供了对应的 DefaultIf
RequireIf
AddIf
方法, 用来根据不同的条件添加不同的配置
3.AddInit
偶尔会有在一行数据读取完之后计算点什么的需求, 比如综合学生的各科成绩打个等第, 所以提供一个 AddInit
方法, 通过传入一个 Func<T, T>
来搞点事情
config.AddInit(item =>
{
item.Field0 += "23333";
// 一些属性的初始化也可以在这边做,代替 Default 也是可以的
item.Field2 = false;
return item;
});
4.ConvertExcel
配置完成之后就可以使用 EPPlusExcelToEntityAsync
将对应的excel转为实体集合
// 如果excel是个文件流
IEnumerable<ExcelTestDto> data = await config.EPPlusExcelToEntityAsync(excelStream);
除了流, 也支持其他的参数
string filepath
- 简单质朴的物理文件路径, 将直接读取物理路径上的excel文件
ExcelPackage pack
EPPlus
的ExcelPackage
, 一般需要手动创建
ExcelWorksheet sheet
EPPlus
的ExcelWorksheet
, 一般需要手动创建
导出(Export/...)
有的时候总是会有人需要把系统里面的列表数据导出成 Excel
然后像个傻逼一样再导回到系统里面去
所以相对导入又做了个导出功能, 两者相似度比较高
1.BuildExportConfig
建个导出配置 ExportConfig
// datas 为 ExcelTestDto集合
var config = new ExportConfig<ExcelTestDto>(datas);
由于导出比较简单粗暴, 所以提供了一个 GenDefaultConfig
可以直接 根据泛型生成 Config (大概不算好用)
2.AddCellOption
由于导出比较简单粗暴, 所以就只有一个 Add
和 AddIf
方法添加单元格设置(虽然是两个)
config
.Add("Field0", item => item.Field0)
.Add("Field1", item => item.Field1)
.Add("Field2", item => item.Field2 ? "Male" : "Female")
.Add("Field3", item => item.Field3);
3.GenerateExcel
使用 EPPlusExportAsync
生成 Excel
// 新版本应该已经支持无参导出为流
// Stream stream = await exportConfig.EPPlusExportAsync();
Stream stream = await exportConfig.EPPlusExportAsync(someStream);
方法会返回一个流, 拿到流之后可以去做你们想做的事情...
也可以传入一个物理路径(string
类型), 这样就会在指定的位置生成excel
TODO
- [x] 无参导出
- [ ] 合并相同的导入配置
- [ ] 考虑添加错误处理
- [ ] 测试性能问题
- [ ] 根据配置生成导入导出配置
- 根据泛型的属性生成配置
- 根据attribute生成配置
- 可以可存入一般关系型数据库的数据生成配置
基于EPPlus和NPOI实现的Excel导入导出的更多相关文章
- 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出
注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能.过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好. 序 由于 poi 本身只是 ...
- 【NPOI】.NET EXCEL导入导出开发包
1.导出 //工作簿HSSFWorkbook HSSFWorkbook hssfworkbook = new HSSFWorkbook(); //ISheet页 ISheet sheet1 = hss ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Excel导入导出帮助类
/// <summary> /// Excel导入导出帮助类 /// 记得引入 NPOI /// 下载地址 http://npoi.codeplex.com/rele ...
- Mego(04) - NET简单实现EXCEL导入导出
前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...
- 土制Excel导入导出及相关问题探讨
转载请注明出处https://www.cnblogs.com/funnyzpc/p/10392085.html 新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗: < ...
- 利用反射实现通用的excel导入导出
如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...
- Excel导入导出的业务进化场景及组件化的设计方案(上)
1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...
- 关于Excel导入导出的用例设计
目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...
随机推荐
- Mybatis逆向工程和新版本MybatisPlus3.4逆向工程的使用
Mybatis和MybatisPlus3.4的使用 目录 Mybatis和MybatisPlus3.4的使用 1 RESTFUL 2 逆向工程 2.1 tkMybatis逆向工程 2.1.1 导入依赖 ...
- 简单介绍session,cookie,token以及区别
Cookie简介 ①.是由服务器发给客户端的特殊信息,以文本的形式存放在客户端 ②.客户端再次请求的时候,会把Cookie回发给服务器 ③.服务器接收到后,会解析Cookie生成与客户端相对应的内容 ...
- mysql8.0.20安装教程,mysql下载安装教程8.0.20
mysql8.0.20下载安装教程 mysql8.0.20安装教程 mysql安装包+mysql学习视频+mysql面试指南视频教程 下载地址: 链接:https://pan.baidu.com/s ...
- Spring自动装配歧义性笔记
Spring自动装配歧义性笔记 如果系统中存在两个都实现了同一接口的类,Spring在进行@Autowired自动装配的时候,会选择哪一个?如下: // 一下两个类均被标记为bean @Compone ...
- uniapp小程序迁移到TS
uniapp小程序迁移到TS 我一直在做的小程序就是 山科小站 也已经做了两年了,目前是用uniapp构建的,在这期间也重构好几次了,这次在鹅厂实习感觉受益良多,这又得来一次很大的重构,虽然小程序功能 ...
- 重磅 | 阿里开源首个 Serverless 开发者平台 Serverless Devs
Serverless 从概念提出到应用,已经走过了 8 个年头,开发者对 Serverless 的使用热情不断高涨.为帮助开发者实现一键体验多云产品,极速部署 Serverless 项目,10 月 2 ...
- 题解 「BZOJ2137」submultiple
题目传送门 题目大意 给出 \(M,k\) ,求出 \[\sum_{x|M}\sigma(x)^k \] 给出 \(P_i\),满足 \(n=\prod_{i=1}^{n}a_i^{P_i}\),其中 ...
- Go语言核心36讲(Go语言进阶技术一)--学习笔记
07 | 数组和切片 我们这次主要讨论 Go 语言的数组(array)类型和切片(slice)类型. 它们的共同点是都属于集合类的类型,并且,它们的值也都可以用来存储某一种类型的值(或者说元素). 不 ...
- PHP伪协议与文件包含漏洞1
PHP文件包含漏洞花样繁多,需配合代码审计. 看能否使用这类漏洞时,主要看: (1)代码中是否有include(),且参数可控: 如: (2)php.ini设置:确保 allow_url_fopen= ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——优化问题与策略
分治策略:解决问题的典型策略,分而治之 将问题分为若干更小规模的部分 通过解决每一个小规模部分问题,并将结果汇总得到原问题的解 递归算法与分治策略 递归三定律 体现了分支策略 应用相当广泛 排序 查找 ...