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…...
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染 你有没有想过,为什么有些AI生成的图片看起来“假假的”,一眼就能认出来?很多时候,问题就出在“质感”上。金属不像金属,玻璃…...
如何快速学习Tinyhttpd:从main函数到完整启动的超精简Web服务器实现指南
如何快速学习Tinyhttpd:从main函数到完整启动的超精简Web服务器实现指南 【免费下载链接】Tinyhttpd Tinyhttpd 是J. David Blackstone在1999年写的一个不到 500 行的超轻量型 Http Server,用来学习非常不错,可以帮助我们真正理解服务器程序的…...
第19篇:多个PI控制器串联控制系统设计与参数整定调试实战
本篇前置知识:掌握自动控制基础原理、熟悉单回路PI控制算法、了解工控闭环系统、会基础Python编程、接触过PLC实操与工控数据采集。 你是否遇到过? 痛点1:只会调试单回路PI控制,碰到多级串联被控对象,系统震荡剧烈、响…...
LFM2.5-1.2B-Thinking-GGUF实战教程:用三句话讲清GGUF——模型本身即教程
LFM2.5-1.2B-Thinking-GGUF实战教程:用三句话讲清GGUF——模型本身即教程 1. 认识LFM2.5-1.2B-Thinking-GGUF LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的一款轻量级文本生成模型,专为低资源环境优化设计。这个模型最大的特点是内置了GGUF格式的模型文…...
3个终极窗口隐藏技巧:如何用Boss-Key打造你的数字隐身衣
3个终极窗口隐藏技巧:如何用Boss-Key打造你的数字隐身衣 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你有没有经历过这样的…...
告别卡顿与路径混乱:手把手教你配置ArcMap 10.x的个性化工作环境
告别卡顿与路径混乱:手把手教你配置ArcMap 10.x的个性化工作环境 ArcMap作为GIS领域的经典工具,其功能强大但默认配置往往无法满足专业用户的效率需求。许多GIS从业者都经历过这样的困扰:软件启动缓慢、数据路径杂乱无章、常用工具隐藏过深。…...
wiliwili与Switch视频播放:解锁离线观影新体验
wiliwili与Switch视频播放:解锁离线观影新体验 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端,目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 在没…...
域适应实战:如何用Python快速实现图像风格迁移(附代码)
域适应实战:Python实现图像风格迁移的工程化解决方案 当你在巴黎街头用手机拍摄埃菲尔铁塔时,是否想过让它瞬间拥有梵高《星月夜》的笔触质感?这种看似魔法的技术背后,是域适应技术在计算机视觉领域的精妙应用。不同于简单的滤镜叠…...
丹青识画系统Prompt工程指南:如何用文本描述引导更精准的风格鉴定
丹青识画系统Prompt工程指南:如何用文本描述引导更精准的风格鉴定 丹青识画这类AI系统,很多人以为它就是个“看图说话”的工具,把图片丢进去,它告诉你这是什么风格、哪个流派。这确实没错,但如果你只这么用࿰…...
遥感智能解译新纪元:GeoSeg破解地物识别效率瓶颈的技术革新
遥感智能解译新纪元:GeoSeg破解地物识别效率瓶颈的技术革新 【免费下载链接】GeoSeg UNetFormer: A UNet-like transformer for efficient semantic segmentation of remote sensing urban scene imagery, ISPRS. Also, including other vision transformers and CN…...
