基于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 数据准备 ...
随机推荐
- 1. PyQt5开发环境的搭建
专栏地址 ʅ(‾◡◝)ʃ 因为我个人使用的是 Linux 还有之前用过Windows 没用过 Mac 所以这里我简单结束 Linux 和 Windows 开发环境的搭建 Windows 开发PyQt5 ...
- 【Java SE进阶】Day12 函数式接口、函数式编程(Lambda表达式)
一.函数式接口介绍 1.概念 仅有一个抽象方法的接口 适用于函数式编程(Lambda使用的接口) 语法糖:方便但原理不变,如for-each是Iterator的语法糖 Lambda≈匿名内部类的语法糖 ...
- Java中的反射机制及反射的优缺点
1. 反射的概念 反射 机制指的是,程序在运行时能够获取自身的信息.在 java 中只要给定类的名字,就能够获取类的所有属性和方法. 反射是 Java 中很多高级特性的基础,比如 注解.动态代理 以及 ...
- Python编程规范之PEP8
Python编程规范-PEP8 PEP是 Python Enhancement Proposal 的缩写. 英文链接: https://legacy.python.org/dev/peps/pep-0 ...
- 数据库MySQL(完结)
SQL注入问题 简介 针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序意料之外结果的攻击行为. 其成因可归结为以下两个原理叠加造成: 程序编写者在处理 ...
- linux配置本地yum源实现在局域网中在线安装软件包
安装linux下安装软件需要安装一系列的rpm包,用rpm -ivh xx和yum install xx 如果用rpm安装软件包的时候,需要自己下载rpm安装包,如果rpm包不全总是提示依赖检查失败或 ...
- mybatis-config.xml 说明
mybatis-config.xml 说明 文件结构 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息. 配置文档的顶层结构如下: configuration(配置) ...
- Spring框架初学习
Spring框架初学习 摘要:今天我终于开始学习大名鼎鼎的Spring框架了,在上大学的时候,经常看见一些课设大佬Spring,Spring的,什么Spring boot,Spring MVC的, ...
- P5687 [CSP-S2019 江西] 网格图
题面 给定一个 \(n\times m\) 的网格图,行从 \(1\sim n\) 编号,列从 \(1\sim m\) 编号,每个点可用它所在的行编号 \(r\) 与所在的列编号 \(c\) 表示为 ...
- 双层拖拽事件,用鼠标画矩形,拖动右下角可以再次改变矩形大小,方案一 有BUG
<template> <div class="mycanvas-container"> <vue-drag-resize :isActive = 't ...