.Net core NPOI导出Excel(csv)优化
时间:2020-03-26
本文章向大家介绍.Net core NPOI导出Excel(csv)优化,主要包括.Net core NPOI导出Excel(csv)优化使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
记得第一篇文章就是.net core 通过NPOI 导入导出excel(csv),之前的那种方式由于我们需要自定表头,每次都要手动写表头非常麻烦。特别是非常多列表头的时候我们得崩溃,,不利于扩展。
所以之后就想着有没有试着获取属性的描述来设置表头,果然尝试成功,然后就方便多了。
首先我们来看之前的导出代码:
public static byte[] OutputExcel(List<T> entitys, string[] title) { IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("sheet"); IRow Title = null; IRow rows = null; Type entityType = entitys[0].GetType(); PropertyInfo[] entityProperties = entityType.GetProperties(); for (int i = 0; i <= entitys.Count; i++) { if (i == 0) { Title = sheet.CreateRow(0); for (int k = 1; k < title.Length + 1; k++) { Title.CreateCell(0).SetCellValue("序号"); Title.CreateCell(k).SetCellValue(title[k - 1]); } continue; } else { rows = sheet.CreateRow(i); object entity = entitys[i - 1]; for (int j = 1; j <= entityProperties.Length; j++) { object[] entityValues = new object[entityProperties.Length]; entityValues[j - 1] = entityProperties[j - 1].GetValue(entity); rows.CreateCell(0).SetCellValue(i); rows.CreateCell(j).SetCellValue(entityValues[j - 1].ToString()); } } } byte[] buffer = new byte[1024 * 2]; using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); buffer = ms.ToArray(); ms.Close(); } return buffer; }
这个函数需要两个参数,一个是要导出的list,一个是表头,假设我们表头有三十个,那我们写表头都崩溃了。
但是我们的实体的属性是一定会写的,所以这个时候就需要我们改造一下了:
首先我们先去获取实体属性的description描述,相信这个在我们建立实体属性的时候就已经写好了,就不用写第二次了。
/// <summary> /// 获取描述 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> private static string GetEnumDescription(PropertyInfo obj) { DescriptionAttribute descAttr = Attribute.GetCustomAttribute(obj, typeof(DescriptionAttribute)) as DescriptionAttribute; if (descAttr == null) { return string.Empty; } return descAttr.Description; }
可以看到我们将属性信息传入进去就可以获取了,只要不是导出超大的excel这里使用的反射可以忽略不计,
然后看看改造之后的代码:
/// <summary> /// 导出不需要表头 /// </summary> /// <param name="entitys"></param> /// <param name="title"></param> /// <returns></returns> public static byte[] OutputFileOutofTitle(List<T> entitys) { IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("sheet"); IRow Title = null; IRow rows = null; if (entitys.Count == 0) { Type entityType = entitys[0].GetType(); PropertyInfo[] entityProperties = entityType.GetProperties(); Title = sheet.CreateRow(0); for (int k = 1; k < entityProperties.Length + 1; k++) { Title.CreateCell(0).SetCellValue("序号"); Title.CreateCell(k).SetCellValue(GetEnumDescription(entityProperties[k - 1])); } } else { Type entityType = entitys[0].GetType(); PropertyInfo[] entityProperties = entityType.GetProperties(); for (int i = 0; i <= entitys.Count; i++) { if (i == 0) { Title = sheet.CreateRow(0); for (int k = 1; k < entityProperties.Length + 1; k++) { Title.CreateCell(0).SetCellValue("序号"); Title.CreateCell(k).SetCellValue(GetEnumDescription(entityProperties[k - 1])); } continue; } else { rows = sheet.CreateRow(i); object entity = entitys[i - 1]; for (int j = 1; j <= entityProperties.Length; j++) { object[] entityValues = new object[entityProperties.Length]; entityValues[j - 1] = entityProperties[j - 1].GetValue(entity); rows.CreateCell(0).SetCellValue(i); if (entityValues[j - 1] != null) { rows.CreateCell(j).SetCellValue(entityValues[j - 1].ToString()); } } } } } byte[] buffer = new byte[1024 * 2]; using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); buffer = ms.ToArray(); ms.Close(); } return buffer; }
这里直接通过类型获取属性信息,之后再获取属性中的描述,其实挺简单的,记录一下吧,要不然又忘了。
原文地址:https://www.cnblogs.com/Ivan-Wu/p/12573056.html
- 体验vs11 Beta
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(24)-权限管理系统-将权限授权给角色
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
- jQuery Gallery Plugin在Asp.Net中使用
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(20)-权限管理系统-根据权限获取菜单
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(18)-权限管理系统-表数据
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(42)-工作流设计-表建立
- 印度税务局调查比特币大户,需缴纳资本利得税;交易所Poloniex强制所有用户完成KYC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- POJ 2054 Color a Tree解题报告
- Jaba_Web--JDBC 删除记录操作模板
- POJ 1789 Truck History 最小生成树
- Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
- Codeforces Round #677 (Div. 3)
- Java_Web--JDBC 增加记录操作模板
- js逐步实现原生控制系统
- STL 训练 POJ - 1862 Stripies
- Cypress系列(66)- 测试运行最佳实践
- Golang内存逃逸是什么?怎么避免内存逃逸?
- js逐步教实现表单系统
- STL训练 HDU - 1716 Ray又对数字的列产生了兴趣:
- Cypress系列(68)- request() 命令详解
- js逐步教实现音乐系统
- 疯子的算法总结(四)贪心算法