EasyExcel导出工具类
目录
工具类
头部实体类(要和工具类在同一个module或项目下)
日期转换器
工具类
/*** 导出Excel工具类*/
public class EasyExcelUtil<T> {/*** 单sheet(Map写入)* @param response 响应对象* @param headList 头部集合* @param dataList 数据集合*/public static void write(HttpServletResponse response, List<ExcelHead> headList, List<Map<String, Object>> dataList) throws IOException {ExcelWriterBuilder writerBuilder = EasyExcel.write();writerBuilder.file(response.getOutputStream());writerBuilder.excelType(ExcelTypeEnum.XLSX);//日期转换器TimestampStringConverter converter = new TimestampStringConverter();writerBuilder.registerConverter(converter).registerWriteHandler(new ColumnWidthStyleStrategy()).head(convertHead(headList)).sheet("sheet1").doWrite(convertData(headList, dataList));}/*** 多sheet(Map写入)* @param response 响应对象* @param headMap 头部Map数据* @param dataMap 数据Map数据* @param sheetMap sheet Map数据*/public static void multipleWrite(HttpServletResponse response, Map<String,List<ExcelHead>> headMap, Map<String,List<Map<String, Object>>> dataMap, Map<String,String> sheetMap) throws IOException {//日期转换器TimestampStringConverter converter = new TimestampStringConverter();ExcelWriter excelWriter = EasyExcel.write().registerConverter(converter).registerWriteHandler(new ColumnWidthStyleStrategy()).file(response.getOutputStream()).excelType(ExcelTypeEnum.XLSX).autoCloseStream(true).build();int i = 0;for (Map.Entry<String,List<ExcelHead>> entry : headMap.entrySet()) {WriteSheet writeSheet = EasyExcel.writerSheet(i++, sheetMap.get(entry.getKey())).head(convertHead(entry.getValue())).build();excelWriter.write(convertData(entry.getValue(), dataMap.get(entry.getKey())), writeSheet);}excelWriter.finish();}/*** 实体写入* @param response 响应对象* @param sheetName sheet名称* @param c 实体类* @param list 实体数据*/public static <T> void writeSheet(HttpServletResponse response, String sheetName, Class<T> c, List<T> list) throws IOException {EasyExcel.write(response.getOutputStream(), c).sheet(sheetName).doWrite(list);}/*** 读取并存储到实体* @param fileName 路径地址* @param sheetName sheet名称* @param c 实体类*/public static <T> List<T> read(String fileName, String sheetName, Class c) {List<T> list = new ArrayList();EasyExcel.read(fileName, c, new ReadListener<T>() {@Overridepublic void invoke(T o, AnalysisContext analysisContext) {list.add(o);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}).sheet(sheetName).doRead();return list;}/*** 读取并存储到实体* @param fileName 路径地址* @param sheetNo 指定sheet*/public static Map<String,Object> readToMap(String fileName, Integer sheetNo) {Map<String,Object> result = new HashMap<>();List<Map<String,Object>> dataList = new ArrayList();//头部mapMap<String,String> headMap = new HashMap<>();//头部拼音mapMap<String,String> pinyinMap = new HashMap<>();EasyExcel.read(fileName,new AnalysisEventListener<Map<Integer, Object>>() {@Overridepublic void invoke(Map<Integer, Object> data, AnalysisContext context) {Map<String,Object> map = new HashMap<>();for (Integer key : data.keySet()) {if(key!=null && data.get(key)!=null) {map.put("field_" + key.toString(), data.get(key));}}dataList.add(map);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}@Overridepublic void invokeHead(Map<Integer, ReadCellData<?>> head, AnalysisContext context) {for (Integer key : head.keySet()) {if(key!=null && head.get(key)!=null && StringUtils.isNotBlank(head.get(key).getStringValue())) {headMap.put("field_" + key.toString(), head.get(key).getStringValue());pinyinMap.put("field_" + key.toString(), Pinyin4jUtils.getPinYinHeadChar(head.get(key).getStringValue()));}}}}).sheet(sheetNo).headRowNumber(1).doRead();result.put("headMap",headMap);result.put("pinyinMap",pinyinMap);result.put("dataList",dataList);result.put("count",dataList.size());return result;}/*** 读取表头并存储到实体* @param fileName 路径地址* @param sheetNo 指定sheet*/public static Map<String,Object> readToMapHead(String fileName, Integer sheetNo) {Map<String,Object> result = new HashMap<>();//头部mapMap<String,String> headMap = new HashMap<>();//头部拼音mapMap<String,String> pinyinMap = new HashMap<>();EasyExcel.read(fileName,new AnalysisEventListener<Map<Integer, Object>>() {@Overridepublic void invoke(Map<Integer, Object> data, AnalysisContext context) {}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}@Overridepublic void invokeHead(Map<Integer, ReadCellData<?>> head, AnalysisContext context) {for (Integer key : head.keySet()) {if(key!=null && head.get(key)!=null && StringUtils.isNotBlank(head.get(key).getStringValue())) {headMap.put("field_" + key.toString(), head.get(key).getStringValue());pinyinMap.put("field_" + key.toString(), Pinyin4jUtils.getPinYinHeadChar(head.get(key).getStringValue()));}}}}).sheet(sheetNo).headRowNumber(1).doRead();result.put("headMap",headMap);result.put("pinyinMap",pinyinMap);return result;}/*** 头部转换* @param headList 头部集合*/private static List<List<String>> convertHead(List<ExcelHead> headList) {List<List<String>> list = new ArrayList<>();for (ExcelHead head : headList) {list.add(Lists.newArrayList(head.getTitle()));}//沒有搞清楚head的参数为List<List<String>>,用List<String>就OK了return list;}/*** 数据转换* @param headList 头部集合* @param dataList 数据集合*/private static List<List<Object>> convertData(List<ExcelHead> headList, List<Map<String, Object>> dataList) {List<List<Object>> result = new ArrayList();//对dataList转为easyExcel的数据格式for (Map<String, Object> data : dataList) {List<Object> row = new ArrayList();for (ExcelHead h : headList) {Object o = data.get(h.getFieldName());//需要对null的处理,比如age的null,要转为-1row.add(handler(o, h.getNullValue()));}result.add(row);}return result;}/*** 空值处理* @param o 数值* @param nullValue 空值置换*/private static Object handler(Object o, Object nullValue) {return o != null ? o : nullValue;}
}
头部实体类(要和工具类在同一个module或项目下)
/*** Excel头部实体*/
public class ExcelHead<T> {private String fieldName;private String title;private T nullValue;public ExcelHead(String fieldName, String title) {this.fieldName = fieldName;this.title = title;}public ExcelHead(String fieldName, String title, T nullValue) {this.fieldName = fieldName;this.title = title;this.nullValue = nullValue;}public String getFieldName() {return fieldName;}public void setFieldName(String fieldName) {this.fieldName = fieldName;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public T getNullValue() {return nullValue;}public void setNullValue(T nullValue) {this.nullValue = nullValue;}
}
注意:真正导出表格的是ExcelWriterSheetBuilder类中的方法,前面只是封装,这个是真正导出用到的;这个类是EasyExcel自带的。
日期转换器
/*** 日期转换器*/
public class TimestampStringConverter implements Converter<Timestamp> {@Overridepublic Class<?> supportJavaTypeKey() {return Timestamp.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic WriteCellData<?> convertToExcelData(Timestamp value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {WriteCellData cellData = new WriteCellData();String cellValue;if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {cellValue = DateUtils.format(value.toLocalDateTime(), null, globalConfiguration.getLocale());} else {cellValue = DateUtils.format(value.toLocalDateTime(), contentProperty.getDateTimeFormatProperty().getFormat(),globalConfiguration.getLocale());}cellData.setType(CellDataTypeEnum.STRING);cellData.setStringValue(cellValue);cellData.setData(cellValue);return cellData;}
}
相关文章:
EasyExcel导出工具类
目录 工具类 头部实体类(要和工具类在同一个module或项目下) 日期转换器 工具类 /*** 导出Excel工具类*/ public class EasyExcelUtil<T> {/*** 单sheet(Map写入)* param response 响应对象* param headList 头部集合* p…...
【Godot4.2】EasyTreeData通用解析
概述 之前在《【Godot4.2】Tree控件自定义树形数据ETD及其解析》一文中,实现了对带缩进的层级结构文本的解析,并将其用于Tree控件的列表项构造。 不过当时并没有实现专门的类,今天花了一点时间实现了一下。现在可以更方便的构造和解析ETD数…...
力扣每日一题109:有序链表转换二叉搜索树
题目 中等 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为 平衡 二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它…...
企业计算机服务器中了locked勒索病毒怎么处理,locked勒索病毒解密建议
随着互联网技术在企业当中的应用,越来越多的企业利用网络开展各项工作业务,网络为企业提供了极大便利,也大大加快了企业发展步伐,提高了企业生产办公效率。但网络技术的发展也为企业的数据安全带来严重威胁。近期,云天…...
开源推荐榜【MalusAdmin基于 Vue3/TypeScript/NaiveUI 和 NET7 Sqlsugar 开发的后台管理框架】
简介 Malus是海棠的意思,顾名思义,海棠后台管理系统,读音与【马卢斯】相近,也可称作为马卢斯后台管理系统。 基于NET Core | NET7/8 & Sqlsugar | Vue3 | vite4 | TypeScript | NaiveUI 开发的前后端分离式权限管理系统,采用…...
批量抓取某电影网站的下载链接
思路: 进入电影天堂首页,提取到主页面中的每一个电影的背后的那个urL地址 a. 拿到“2024必看热片”那一块的HTML代码 b. 从刚才拿到的HTML代码中提取到href的值访问子页面,提取到电影的名称以及下载地址 a. 拿到子页面的页面源代码 b. 数据提…...
2024-05-06 问AI: 介绍一下深度学习中的LSTM网络
文心一言 当谈到深度学习中的LSTM(Long Short-Term Memory)网络时,它是一种特殊的循环神经网络(RNN)架构,旨在解决传统RNN在处理长序列时遇到的梯度消失和梯度爆炸问题。LSTM网络因其能够捕捉序列数据中的…...
二、Redis五种常用数据类型-String
1、用途 简单的K-V缓存计数器分布式锁session共享分布式ID生成(自增) 2、底层实现结构 Redis底层是c语言实现的,但是并没有使用c的string来表示字符串,而是使用自己的简单动态字符串的抽象类型(simple dynamic string,SDS)。 SDS结构: st…...
echarts柱状图实现左右横向对比
实现效果如上图 其实是两组数据,其中一组数据改为负数,然后 在展示的时候,在将负数取反 第一处修改坐标轴 xAxis: [{type: value,axisLabel: {formatter: function (value) {if (value < 0) {return -value;}else{return value;}}}}], 第…...
脸爱云一脸通智慧管理平台 SystemMng 管理用户信息泄露漏洞(XVE-2024-9382)
0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大,运行稳定,操作简单方便,用户界面美观,轻松统计数据的一脸通系统。无需安装,只需在后台配置即可在浏览器登录。 功能包括:系统管理中心、人员信息管理中心、设备管理中心、消费管理子系统、订餐管理子系统、水控管…...
spring笔记2
一、基于xml的AOP实现 基于注解管理Bean,注解扫描 <context:component-scan base-package"com.zhou.spring.aop.xml"></context:component-scan><aop:config> <!-- 设置一个公共的切入点表达式--><aop:pointcut id&q…...
【挑战30天首通《谷粒商城》】-【第一天】02、简介-项目整体效果展示
文章目录 课程介绍 ( 本章了解即可,可以略过)一、 分布式基础 (全栈开发篇) (初中级)二、 分布式高级 (微服务架构篇) ( 高级)三、高可用集群 (架构师提升篇)( 架构 ) one more thing 课程介绍 ( 本章了解即可,可以略过) 1.分布式基础(全栈开发篇)2.分布…...
Kafka 生产者应用解析
目录 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 2.2、带回调函数的异步发送 3、同步发送 API 4、生产者分区 4.1、分区的优势 4.2、生产者发送消息的分区策略 示例1:将数据发往指定 partition 示例2:有 key 的…...
GEE错误——image.reduceRegion is not a function
简介 image.reduceRegion is not a function 这里的主要问题是我们进行地统计分析的时候,我们的作用对象必须是单景影像,而不是影像集合 错误"image.reduceRegion is not a function" 表示你正在尝试使用reduceRegion()函数来处理图像数据&…...
rk356x 关于yocto编译linux及bitbake实用方法
Yocto 完整编译 source oe-init-build-envbitbake core-image-minimalYocto 查询包名 bitbake -s | grep XXX // 获取rockchip相关包 :~/rk3568/yocto$ bitbake -s | grep rockchip android-tools-conf-rockchip :1.0-r0 gstreamer1.0-rockchip …...
Chrome您的连接不是私密连接 |输入“thisisunsafe”命令绕过警告or添加启动参数
一、输入 thisisunsafe 在当前页面用键盘输入 thisisunsafe ,不是在地址栏输入(切记),就直接敲键盘就行了 因为Chrome不信任这些自签名ssl证书,为了安全起见,直接禁止访问了,thisisunsafe 这个命令,说明你…...
牛客面试前端1
HTML语义化 是什么 前端语义化是指在构建网页时多使用html语义化标签布局,多使用带有语义的标签如header,aside,footer等标签为什么 结构清晰利于开发者开发与维护 有利于seo搜索引擎优化 有利于在网络卡顿时,正常显示页面结构&a…...
Linux的软件包管理器-yum
文章目录 软件包的概念yum源的配置的原因yum的使用查看软件包安装软件卸载软件 软件包的概念 软件包(SoftWare Package)是指具有特定的功能,用来完成特定任务的一个程序或一组程序。可分为应用软件包和系统软件包两大类 在Linux系统中,下载安装软件的方式…...
选择排序(Selection Sort)
选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下: 遍历数组:从待排序的数列中,找到当前未排序部分(即整个数组或已排序部分之后的部分)中的最小(或最大,取决于排序方式)元素。 交换位置:将找到的最小元素与未排序部分的第一个元素交换位置,这…...
网络面试题目
1、BGP报文有哪些? 有5种报文,Open、 Update、 Notification、 Keepalive和 Route-refresh等5种报文类型。 2、Vxlan了解多少? VLAN作为传统的网络隔离技术,VXLAN完美地弥补了VLAN的上述不足。 VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),(VXL…...
企业 AI 转型隐性成本:那些容易被忽视的冤枉钱
企业 AI 转型的核心诉求,是提升效率、降低长期成本。但很多企业在启动项目时,往往只关注模型采购、硬件部署等显性支出,却忽略了Token 消耗、人才摸索周期、SaaS 持续续费等隐性成本,最终导致投入远高于预期,效果却不达…...
PPTX判断包含表id,打印 table表中每个cell内容
PPTX判断包含表id,打印 table表中每个cell内容 i0 for shape in prs.slides[0].shapes: if shape.has_table: # 获取表格 print(fshape{i}) table shape.table for row in range(len(table.rows)): for col in…...
告别空间焦虑:双系统环境下无损扩容Ubuntu磁盘的实战指南
1. 为什么双系统用户总会遇到Ubuntu空间不足? 刚装完WindowsUbuntu双系统时,很多人会习惯性地给Ubuntu分配较小的磁盘空间。我当时也是这么想的:"反正主要用Windows,100GB给Ubuntu应该够了吧?"结果三个月后&…...
Gemini CLI:将AI助手集成到终端,提升开发者效率的实战指南
1. 从命令行到智能伙伴:为什么你需要一个终端里的AI助手如果你和我一样,每天大部分时间都泡在终端里,那么你肯定经历过这样的场景:面对一个陌生的代码库,想快速理解它的架构,却不得不花上半天时间在文件树和…...
Cursor Pro无限使用终极指南:三步解锁AI编程神器的完整方案
Cursor Pro无限使用终极指南:三步解锁AI编程神器的完整方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached you…...
AI代理如何通过MCP协议安全自动化DeFi期权价差交易
1. 项目概述:为AI交易员打造的DeFi期权交易接口如果你正在探索如何让AI智能体(比如OpenClaw或Bankr)在Base链上的Callput协议进行自动化期权交易,那么你很可能已经发现,现有的工具要么过于复杂,要么需要大量…...
量子金融强化学习:FinRL-Library实现AI量化交易的终极指南
量子金融强化学习:FinRL-Library实现AI量化交易的终极指南 【免费下载链接】FinRL FinRL: Financial Reinforcement Learning. 🔥 项目地址: https://gitcode.com/gh_mirrors/fi/FinRL-Library FinRL-Library作为金融强化学习领域的开源框架&…...
利用Taotoken统一管理多个AI项目的API密钥与访问权限
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken统一管理多个AI项目的API密钥与访问权限 对于同时维护多个AI应用或为不同客户部署服务的开发者与团队而言,…...
在Hermes Agent项目中配置Taotoken作为自定义模型供应商的详细步骤
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Hermes Agent项目中配置Taotoken作为自定义模型供应商的详细步骤 对于使用Hermes Agent框架的开发者而言,接入不同的…...
从0到1构建DeepSeek抗注入能力:97.3%拦截率验证的5层LLM网关架构设计
更多请点击: https://intelliparadigm.com 第一章:从0到1构建DeepSeek抗注入能力:97.3%拦截率验证的5层LLM网关架构设计 为应对Prompt注入、越狱指令与上下文污染等高阶对抗攻击,我们设计并落地了一套轻量级、可插拔的5层LLM网关…...
