基于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 数据准备 ...
随机推荐
- Training: Get Sourced
原题链接:http://www.wechall.net/challenge/training/get_sourced/index.php 提示告诉我们答案就藏在这个界面中,使用View Sourcec ...
- 关于pip3 ImportError: cannot import name 'main'的报错的原因及解决办法
这个问题的出现大多数都是因为你用错误的方法去升级pip3导致的 先来说一下正确的升级方法: python3 -m pip install --upgrade pip 我发现升级后版本变为了 19.x, ...
- Zabbix与乐维监控对比分析(一)——架构、性能篇
近年来,Zabbix凭借其近乎无所不能的监控及优越的性能一路高歌猛进,在开源监控领域独占鳌头:而作为后起的新锐IT监控平台--乐维监控,则不断吸收Zabbix,Prometheus等优秀开源平台的优点 ...
- 视频超分之BasicVSR-阅读笔记
1.介绍 对于视频超分提出了很多方法,EDVR中采用了多尺度可变形对齐模块和多个注意层进行对齐和定位并且从不同的帧聚合特征,在RBPN中,多个投影模块用于顺序聚合多个帧中的特征.这样的设计是有效的,但 ...
- 【Oracle】Oracle读取RAW二进制类型并实现与十六进制的相互转换
1.十六进制转二进制 select HEXTORAW('7264B1CD0582734D8E27E0FBDA15B2A5') from dual; 2.二进制转十六进制 select AUUID_0, ...
- 【SQL基础】【记住重命名】高级查询:聚合函数(四舍五入)、分组过滤、排序、
〇.概述 1.功能概述 高级查询:聚合函数(四舍五入).分组过滤.排序. 2.建表语句 drop table if exists user_profile; CREATE TABLE `user_pr ...
- python模块的含义
目录 模块简介 模块的本质 python模块的历史 python模块的表现形式 模块的分类 导入模块的两种句式 强调 import句式 import流程推导 练习 from...import...句式 ...
- python基础(数据库、可视化软件Navicat、python操作MySQL)
多表查询的两种方法 数据准备: 建表 create table dep( id int primary key auto_increment, name varchar(20) ); create t ...
- 前端知识之JS(javascirpt)
目录 JS简介 JS基础 1.注释语法 2.引入JS的多种方式 3.结束符号 变量与常量 基本数据类型 1.数字类型(Number) 2.字符类型(string) 3.布尔类型(Boolean) 4. ...
- axios 中get 和post传参
axios中get和ppost传参的方式: params是添加到url的请求字符串中的,一般用于get请求. data是添加到请求体(body)中的, 一般用于post请求. 上面,只是一般情况. 其 ...