基于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 数据准备 ...
随机推荐
- 数据结构初阶--顺序表(讲解+C++类模板实现)
顺序的概念与结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 一般分为两种:静态顺序表和动态顺序表 静态顺序表 #define ...
- 大前端html基础学习02
CSS核心属性 一.css属性和属性值的定义 属性:属性是指定选择符所具有的属性,它是css的核心. 属性值:属性值包括法定属性值及常见的数值加单位,如25px,或颜色值等. 二.CSS文本属性 1. ...
- 2022-2023年度必备宇宙最全Windows系统软件清单
作为PC端的第一生产力工具,相信对于绝大部分人来说,Windows系统是一款不可替代的产品.既然如此,Pytrick今天就拿出珍藏多年的压箱底宝贝无偿分享给各位,给大家逐一介绍下这些体验一级棒的应用软 ...
- 谁说.NET没有GC调优?只改一行代码就让程序不再占用内存
经常看到有群友调侃"为什么搞Java的总在学习JVM调优?那是因为Java烂!我们.NET就不需要搞这些!"真的是这样吗?今天我就用一个案例来分析一下. 昨天,一位学生问了我一个问 ...
- 设计链表-LeetCode707 基础题
LeetCode链接:https://leetcode.cn/problems/design-linked-list/ 题目:设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属 ...
- 【java】【File】用File相关类写一个小工具,完成从指定目录下抽取指定文件并复制到新路径下完成重命名的功能
今日份代码: import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.io.*; i ...
- Java开发如何通过IoT边缘ModuleSDK进行协议转换?
摘要:使用ModuleSDK开发插件应用,接入其他协议设备(如HTTP请求数据),将其他协议的数据转化为MQTT协议JSON数据上报到IoTDA. 本文分享自华为云社区<[华为云IoTEdge开 ...
- 东拼西凑学java
前言 随着大环境的影响,互联网寒冬降临,程序员的日子越来越难,搞不好哪天就被噶了,多学点东西也没啥坏处,国内市场java如日中天,出门在外不会写两行java代码,都不好意思说自己是程序员,伪装成一个萌 ...
- git相关问题解析,你想要的都有🔥
官网文档: https://git-scm.com/doc 本地克隆远程代码仓库 git clone 地址 本地同步全量历史数据,克隆所有文件的历史记录 git clone 地址 -depth 1 本 ...
- JavaScript:立即执行函数
想象一下,如果我希望某个代码块,只执行一次,就不再执行,应该怎么办? 代码块肯定是用函数来表示,执行肯定是调用函数,但是确保只执行一次,该怎么办? 我们为什么可以多次调用函数,因为函数名指向了函数的内 ...