基于NPOI封装导出Excel方法
背景:
在工作中我们有一个很常见的业务场景:导出列表的数据,生成Excel,而使用NPOI生成Excel我们也会遇到一个问题,每遇到一个不同的类导出时都要生成不同的表头,行,列,但其实里面大部分代码都是冗余的,所以这时我就想到了一个点子,通过泛型和反射整一个通用的导出方法.
导出思路:
其实这个业务场景的原理很简单,首先我们需要查出数据并且将数据生成Excel文件再通过IO流保存在我们服务器中,最后再将完整的链接地址返回给前端,前端访问就直接下载下来了,还有一个问题则是解决那些冗余代码,这里就是我们上面提到的可以通过泛型和反射封装一个通用的导出方法或者整一个IEnumber<T>的扩展方法.
环境:
代码环境使用的是.Net 6.0,
Nuget包:

实现:
第一步,我们需要写一个泛型获取到泛型所有的字段名称和值的方法,用于生成表头,行,列做铺垫,代码如下:
/// <summary>
/// 获取对象属性名称和值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public IEnumerable<KeyValue> GetProperties<T>(T t)
{
var result = new List<KeyValue>();
System.Reflection.PropertyInfo[] properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
foreach (System.Reflection.PropertyInfo item in properties)
{
string name = item.Name; //名称
object value = item?.GetValue(t, null) ?? string.Empty; //值 //if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))
//{
result.Add(new KeyValue() { Key = item.Name, Value = item.GetValue(t, null) });
//}
}
return result;
}
第二步,封装一个导出Excel文件的方法,通过List<T>解决冗余的问题,并通过不同的类型生成不同的Excel并且通过IO流存入服务器中
/// <summary>
/// 通用导出
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entitys"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public string ExportExcel<T>(IEnumerable<T> entitys, string fileName)
{
if (entitys == null || !entitys.Any()) return "无数据";
XSSFWorkbook workBook = new XSSFWorkbook();
ISheet sheet1 = workBook.CreateSheet("Sheet1");
{
var properties1 = GetProperties(entitys.ToList()[0]);
//创建表头
var row = sheet1.CreateRow(0);
for (var i = 0; i < properties1.Count(); i++)
{
var cell = row.CreateCell(i);
cell.SetCellValue(properties1.ToList()[i].Key);
}
}
//生成数据
int index = 1;
foreach (var entity in entitys)
{
var properties = GetProperties(entity);//获取类中字段的名称和值
var row = sheet1.CreateRow(index);
var list = properties.ToList();
for (var i = 0; i < properties.Count(); i++)
{
var cell = row.CreateCell(i);
//var itemValue = list.FirstOrDefault(d => d.Key == heads[i]);
cell.SetCellValue(list[i].Value?.ToString() ?? string.Empty);
}
index++;
}
string defaultPath = System.IO.Directory.GetCurrentDirectory() + "/wwwroot/upload/file";
if (!System.IO.Directory.Exists(defaultPath))
{
System.IO.Directory.CreateDirectory(defaultPath);//不存在就创建文件夹
}
//创建文件
var file = new FileStream(defaultPath + "/" + fileName, FileMode.Create);
workBook.Write(file);
file.Close();
return "upload/file/" + fileName;
}
结尾:
需要注意的是,生成的表头,为类字段的名称,导出的Dto字段名称可以写成中文的,如果不想在代码中出现中文,可以再加一个List<string> heads//表头的参数,更改掉生成表头那段代码.
最后希望这篇文章可以帮到你哦,文中有不足的地方也欢迎指正嘻嘻
基于NPOI封装导出Excel方法的更多相关文章
- Npoi导入导出Excel操作
之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- .Net core NPOI导入导出Excel
最近在想.net core NPOI 导入导出Excel,一开始感觉挺简单的,后来真的遇到很多坑.所以还是写一篇博客让其他人少走一些弯路,也方便忘记了再重温一遍.好了,多的不说,直接开始吧. 在.Ne ...
- NPOI导入导出Excel
.net mvc利用NPOI导入导出excel 注意:如何导出的提交方式ajax导出是失效的! 解决方案是:js处理l两个表单的提交 代码: 第一步. 在页面里面加入2个隐藏的iframe, 如下 ...
- C# Datatable导出Excel方法
C# 导出Excel方法 先引用下System.IO;System.data; 具体函数如下: public static bool ExportCSV(DataTable dt, string f ...
- c# 导入导出excel方法封装
在很多项目中,都会使用到文件的上传下载等,为了方便,封装了一个帮助类,每次直接拿过来使用就可以了,下面是封装的类和使用方法. using Common.AttributeHelper; using N ...
- .NET导入导出Excel方法总结
最近,应项目的需求,需要实现Excel的导入导出功能,对于Web架构的Excel导入导出功能,比较传统的实现方式是: 1)导入Excel:将Excel文件上传到服务器的某一文件夹下,然后在服务端完成E ...
- .net mvc利用NPOI导入导出excel
1.导出Excel :首先引用NPOI包(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> ...
- Web C# 导出Excel 方法总结
方法1:微软推荐服务器需安装Excel型 依赖: 软件:Office Excel 2007-2013 引用:Microsoft Office 14.0 Object Library 1.1 数据准备 ...
随机推荐
- 真正“搞”懂HTTP协议05之What's HTTP?
前面几篇文章,我从纵向的空间到横向的时间,再到一个具体的小栗子,可以说是全方位,无死角的覆盖了HTTP的大部分基本框架,但是我聊的都太宽泛了,很多内容都是一笔带过,再加上一句后面再说就草草结束了.并且 ...
- uniCloud云开发入门以及对传统开发方式的思考
事情缘由 作为选修了移动互联网应用的一员,老师讲的什么JS基础,还有ES6和uniapp,当然是没怎么听,因为是之前大二的时候都大概看过. 但是快到期末,老师讲了云开发,并且布置了与此相关的大作业,自 ...
- day20 关联查询与多表联查 & 子查询与union联合查询 & 数据库定义语言DDL
day20 关联查询 #左连接:表名 left join 表名 以左表为主表,只显示与左表能匹配的行 SELECT s.*,q.* FROM student AS s LEFT JOIN queue_ ...
- L1-049 天梯赛座位分配 (20分)
L1-049 天梯赛座位分配 (20分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i ...
- Flaks框架(Flask请求响应,session,闪现,请求扩展,中间件,蓝图)
目录 一:Flask请求响应 1.请求相关信息 2.flask新手四件套 3.响应相关信息(响应response增加数据返回) 二:session 1.session与cookie简介 2.在使用se ...
- js四舍五入保留两位小数的方法
四舍五入方法: 1,toFixed(): 此方法只包含小数位数的数字,适合处理金钱 2,toPrecision() :此方法包含所有数字, 不需要四舍五入 1,Math.floor()
- Linux基础 文件和目录
文件和目录 前言 本章讨论文件属性和文件系统内容.除了上一章讨论的普通文件,Linux的文件概念还包括:目录.设备等.在Linux系统中,文件的种类包括:普通文件.目录.符号链接.块设备.字符设备.管 ...
- ssm——mybatis整理
目录 1.mybatis框架概述 2.直接使用jdbc连接数据库带来的问题 3.mybatis连接池 3.1.mybatis连接池yml配置 3.2.mybatis连接池xml配置 4.一个简单的my ...
- python基础23 之初识面向对象
人狗大战 # 编写代码简单实现人打狗 狗咬人的小游戏 """推导步骤1:代码定义出人和狗""" person1 = { 'name': 'j ...
- python进阶之路17 包的使用、collections、time、random模块
包 大白话: 多个py文件的集合>>>:文件夹 专业:内部含有__init__.py文件的文件夹(python2 必须要求 python3无所谓) 包的具体使用 虽然python3对 ...