最新要闻
- 社区工作者感受垃圾分类处理全过程
- 北京西京医院杨博华_北京西京医院
- 64核CPU、显卡三连冠 AMD超算屠榜:唯一一台百亿亿次
- 国产SSD卷疯了!梵想S500 Pro 2TB只要409元 观天下
- 最轻薄潜望手机!OPPO Reno10 Pro+亮相
- 当前关注:搭载4.0L水平对置发动机 300万的保时捷中国开卖:但不能上路
- 淮北建投20亿元公司债将付息 利率6.30%
- 用上3.0T直六发动机!马自达旗舰CX-90现身:今年内国产_天天看热讯
- 今日播报!Win11最新版发布:性能更好更丝滑
- 粤港澳大湾区首个京粤产业协作中心挂牌并落户广州黄埔 快播报
- 苹果WWDC23终极“剧透”:iOS 17登场 首款头显万众期待 天天精选
- 天天热点评!《原神》3.7版本正式上线!原神首个卡牌赛事登场
- 99包邮手慢无!匹克路威篮球鞋2折清仓(门店469元)
- 脾气真大!一特斯拉插队未遂现场报复:直接加速撞车 全球快看
- 甄子丹出演苹果广告:叶师傅 切他中路!|当前焦点
- 切辣椒手很辣该怎么办_切辣椒手辣要几个小时消失
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点快播:Spring Boot 我随手封装了一个万能的 Excel 导出工具,传什么都能导出!
前言
如题,这个小玩意,就是不限制你查的是哪张表,用的是什么类。
【资料图】
我直接一把梭,嘎嘎给你一顿导出。
我知道,这是很多人都想过的, 至少我就收到很多人问过我这个类似的问题。
我也跟他们说了,但是他们就是不动手,其实真的很简单。
不动手怎么办? 我出手呗。
不多说开搞 。
正文
玩法很简单。
要实现的效果 :
类是不确定的 ,User ?Student ? District ? 不确定。
但是呢我们封装出来的函数,要足够支撑不同的类,我们自动去读取遍历list ,然后导出生成文件。
核心的思路是什么 ?
其实就还是利用csv文件的内容格式本质 ,看这两幅图 :
我们要实现万能的类导出excel !!!
思路是什么 :
① 我们从不确定的类 的集合list 中,取出 里面的类。
反射一手,拿出里面的属性名, 做第一行表格行标题名称拼接。
②拼接内容
因为类不确定,那么我们就采取反射把类全部字段属性作为key丢到map里面,同时把值丢到value里面。
这样我们拼接内容的时候只需要根据map 嘎嘎一顿遍历拼接即可。
推荐一个开源免费的 Spring Boot 最全教程:
https://github.com/javastacks/spring-boot-best-practice
1.依赖
org.apache.poi poi-ooxml 3.15 org.apache.poi poi-scratchpad 3.15 com.alibaba fastjson 1.2.69 commons-io commons-io 2.5
2. 核心的工具类,函数我都封装好了
MyCsvFileUtil.java
import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.IOUtils;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.text.SimpleDateFormat;import java.util.*;/** * @author JCccc * @Remark 是我 */@Slf4jpublic class MyCsvFileUtil { public static final String FILE_SUFFIX = ".csv"; public static final String CSV_DELIMITER = ","; public static final String CSV_TAIL = "\r\n"; protected static final String DATE_STR_FILE_NAME = "yyyyMMddHHmmssSSS"; /** * 将字符串转成csv文件 */ public static void createCsvFile(String savePath, String contextStr) throws IOException { File file = new File(savePath); //创建文件 file.createNewFile(); //创建文件输出流 FileOutputStream fileOutputStream = new FileOutputStream(file); //将指定字节写入此文件输出流 fileOutputStream.write(contextStr.getBytes("gbk")); fileOutputStream.flush(); fileOutputStream.close(); } /** * 写文件 * * @param fileName * @param content */ public static void writeFile(String fileName, String content) { FileOutputStream fos = null; OutputStreamWriter writer = null; try { fos = new FileOutputStream(fileName, true); writer = new OutputStreamWriter(fos, "GBK"); writer.write(content); writer.flush(); } catch (Exception e) { log.error("写文件异常|{}", e); } finally { if (fos != null) { IOUtils.closeQuietly(fos); } if (writer != null) { IOUtils.closeQuietly(writer); } } } /** * 构建文件名称 * @param dataList * @return */ public static String buildCsvFileFileName(List dataList) { return dataList.get(0).getClass().getSimpleName() + new SimpleDateFormat(DATE_STR_FILE_NAME).format(new Date()) + FILE_SUFFIX; } /** * 构建excel 标题行名 * @param dataList * @return */ public static String buildCsvFileTableNames(List dataList) { Map map = toMap(dataList.get(0)); StringBuilder tableNames = new StringBuilder(); for (String key : map.keySet()) { tableNames.append(key).append(MyCsvFileUtil.CSV_DELIMITER); } return tableNames.append(MyCsvFileUtil.CSV_TAIL).toString(); } /** * 构建excel内容 * @param dataLists * @return */ public static String buildCsvFileBodyMap(List dataLists) { //不管你传什么玩意,我都给你反射一手,搞成Map List
代码注意点(各种小封装):
①类转map
② 反射转map 取字段属性名 拼接 标题
③ 针对list<不确定类>
转化成list
,然后拼接excel内容
测试代码:
@RequestMapping("/createCsvFileJcTest")public void createCsvFileJcTest() { //类不确定 随便怎么传都行 List districts = districtService.queryByParentCodes(Arrays.asList("110100")); //存放地址&文件名 String fileName = "D:\\mycsv\\"+MyCsvFileUtil.buildCsvFileFileName(districts); //创建表格行标题 String tableNames = MyCsvFileUtil.buildCsvFileTableNames(districts); //创建文件 MyCsvFileUtil.writeFile(fileName, tableNames); //写入数据 String contentBody = MyCsvFileUtil.buildCsvFileBodyMap(districts); //调用方法生成 MyCsvFileUtil.writeFile(fileName, contentBody);}
看看效果:
导出的excel文件内容:
接下来换个类玩玩:
然后导出看看效果:
可以看到数据导出也是OK的:
没错就是这么简单, 当然也是抛转引玉, 希望大家看了这篇文章,可以借鉴这些反射的函数玩法,做更多的好玩的封装,比如加上一些自定义注解的解析,比如加上一些前后置拦截器拓展等等。
扩展
上面的示例中导出的表头是属性名,如果正式的导出通常需要自定义表头名称,我们这里可以使用自定义注解来完成。
JcExcelName.java
/** * @Author : JCccc * @CreateTime : 2020/5/14 * @Description : **/@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface JcExcelName { String name() default "";}
然后在想导出的类里面,想加看得懂的名字就加,不加就拿属性名:
随手再写一个 ,新的反射解析拿字段属性注解值函数:
public static List resolveExcelTableName(T entity) { List tableNamesList = new ArrayList<>(); Class extends Object> bean = entity.getClass(); Field[] fields = bean.getDeclaredFields(); Map map = new HashMap<>(fields.length); for (Field field : fields) { try { if (!"serialVersionUID".equals(field.getName())) { String tableTitleName = field.getName(); JcExcelName myFieldAnn = field.getAnnotation(JcExcelName.class); String annName = myFieldAnn.name(); if (StringUtils.hasLength(annName)) { tableTitleName = annName; } tableNamesList.add(tableTitleName); } } catch (Exception e) { log.warn("toMap() Exception={}", e.getMessage()); } } return tableNamesList;}
然后根据解析出来的注解值列名拼接 表格标题名格式:
public static String buildCsvFileTableNamesNew(List dataList) { StringBuilder tableNames = new StringBuilder(); for (String name : dataList) { tableNames.append(name).append(MyCsvFileUtil.CSV_DELIMITER); } return tableNames.append(MyCsvFileUtil.CSV_TAIL).toString();}
测试看看效果:
public static void main(String[] args) { User user = new User(); List nameList = MapUtils.resolveExcelTableName(user); System.out.println(nameList.toString()); String tableNames = buildCsvFileTableNamesNew(nameList); System.out.println(tableNames);}
效果嘎嘎好:
然后反手就搞到我们前面的文章使用例子里面:
String tableNames = MyCsvFileUtil.buildCsvFileTableNamesNew( MyCsvFileUtil.resolveExcelTableName(dataList.get(0)));
执行一下示例接口,看看效果:
文件出来了:
打开看看效果:
好了,就到这吧,非常完美。
来源:blog.csdn.net/qq_35387940/article/details/129062470
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
-
焦点快播:Spring Boot 我随手封装了一个万能的 Excel 导出工具,传什么都能导出!
前言如题,这个小玩意,就是不限制你查的是哪张表,用的是什么类。我直接一把梭,嘎嘎给你一顿导出。我知
来源: -
火山引擎DataLeap联合DataFun发布《数据治理知识地图》_世界新消息
近期,火山引擎DataLeap和技术社区DataFun联合发布《数据治理知识地图专业版V1》(以下简称“地图”),地
来源: 焦点快播:Spring Boot 我随手封装了一个万能的 Excel 导出工具,传什么都能导出!
火山引擎DataLeap联合DataFun发布《数据治理知识地图》_世界新消息
当前要闻:推荐一个AI导航网站 - 收录的都是热门AI工具
社区工作者感受垃圾分类处理全过程
北京西京医院杨博华_北京西京医院
64核CPU、显卡三连冠 AMD超算屠榜:唯一一台百亿亿次
国产SSD卷疯了!梵想S500 Pro 2TB只要409元 观天下
最轻薄潜望手机!OPPO Reno10 Pro+亮相
当前关注:搭载4.0L水平对置发动机 300万的保时捷中国开卖:但不能上路
淮北建投20亿元公司债将付息 利率6.30%
springboot~mybatis-plus的DynamicTableNameInnerInterceptor实现分表
用上3.0T直六发动机!马自达旗舰CX-90现身:今年内国产_天天看热讯
今日播报!Win11最新版发布:性能更好更丝滑
粤港澳大湾区首个京粤产业协作中心挂牌并落户广州黄埔 快播报
苹果WWDC23终极“剧透”:iOS 17登场 首款头显万众期待 天天精选
天天热点评!《原神》3.7版本正式上线!原神首个卡牌赛事登场
99包邮手慢无!匹克路威篮球鞋2折清仓(门店469元)
脾气真大!一特斯拉插队未遂现场报复:直接加速撞车 全球快看
甄子丹出演苹果广告:叶师傅 切他中路!|当前焦点
焦点播报:“五一”假期出行,伴随着哪些风险
全网最全的编程电子书大合集,超千本打包下载
求求你,不要再把ER图和数据库模型图搞混了好嘛?
【一步步开发AI运动小程序】六、人体骨骼图绘制|聚焦
全球观点:云图说丨初识商标注册服务
切辣椒手很辣该怎么办_切辣椒手辣要几个小时消失
焦点速讯:《街霸6》将迎合新一代玩家:隆、肯和春丽等老角色将被取代
今日精选:女孩减肥去世 体重仅24.8公斤!科普神经性厌食危害
“BOSS直聘崩了”登上热搜 公司回应:PC端异常 已紧急修复
电竞首次入赛!杭州亚运会《DOTA2》国家集训队名单出炉:共27人
今日关注:轻微交通事故APP快处 全国首批36城上线!附操作方法
微软重磅宣布!Windows 的“ AI 时刻”来了_环球新消息
【解决方法】SecureCRT远程工具无法show命令无法使用管道符完成中文过滤检索
Apache Hudi 在袋鼠云数据湖平台的设计与实践
CloudQuery v2.0.0 发布 | 新增数据保护、数据变更、连接管理等功能_环球观点
动态:JavaScript基础语法之 || 和 ?? 的踩坑记录
里夫斯:我在发声上做得不如詹眉 但高的篮球IQ会帮我提高领导力 世界微资讯
昆明国资委:“昆明银行口专家路演要点”和《昆明城投专家会议纪要》不实-焦点热门
微动态丨吉利也来“围攻”比亚迪 银河L7上市定档:1.5T插混能跑1300km
官网不停运!亚马逊中国回应7月关闭应用商店:不影响业务运营 天天快播报
迎来重磅更新!Win11文件管理器界面UI将整体重做
低价游太空梦破碎!维珍轨道破产 三大航空公司瓜分其资产|今日快看
双摄像头一览无余!萤石Y3000FVX极光人脸视频锁图赏|世界快资讯
【世界播资讯】现场直击|凯瑞特亮相CTT Expo 2023,热度飙升,实力圈粉
焦点讯息:sipp重放rtp数据测试FreeSWITCH
Algorithm_01--C#递归算法02 每日速看
HTML中的attribute 和 property
世界快资讯:Wi-Fi 6都没玩明白 怎么就惦记上Wi-Fi 7了?
今日关注:马斯克:已确定特斯拉接班人、自己有意外他将接管公司
速递!星巴克家享黑咖啡2.5元/杯大促 原价15元
世界微动态丨明天发布!小米Civi 3首发天玑8200-Ultra:能效、影像增强
千呼万唤始出来!微软官宣Win11任务栏不合并将回归
农发行广西区分行与东兰县签署战略合作协议
苹果MR或将推出 “果链”企业频受调研_环球快消息
骆仁童老师主讲《数字经济下电力业转型》课程 | 河北某地热电企业-2023年中高层管理人员培训班(二期)
80年代曾风靡全球 乐高为“吃豆人”游戏打造了一款街机 还能玩 焦点快看
世界热点评!新能源汽车高歌猛进 5月销量预计大增60% 渗透率超1/3
乌冬面里吃出活青蛙 日本连锁店鞠躬道歉:网友看完大呼恶心|世界热闻
越南打工人不加班逼急中国老板 不为钱放弃生活:全球各国每日工作时间一览-世界快讯
美国债务上限谈判未破僵局 避险美债再获追捧
为什么说人民币汇率不会大起大落-全球快播报
茶叶的故乡是哪里 茶的故乡是哪儿 天天报资讯
史诗级更新!特斯拉2023.12.9 OTA推送:强制单踏板成历史_天天短讯
Win10已死!微软发布Windows 11大更新:引入ChatGPT、升级巨大
《英雄联盟》衍生游戏!《聚点危机:英雄联盟外传》开售:GTX 460爽玩
全面实施国六B 这类汽车将禁止销售 会大幅降价吗?-今日播报
芦荟胶去红血丝效果好吗(芦荟胶对红血丝有效果吗)
焦点!5899元起 索尼新一代超广角变焦Vlog相机ZV-1 II发布
MarkDown的使用(一)
全球动态:宁波海达控股集团有限公司
苹果遭殃!逃税近千亿元-世界要闻
美团登陆香港的第一天 就把外卖价格干下来了! 环球新要闻
【天天时快讯】AMD Zen2架构复活!6nm重生、居然还有2核心2线程
主板卖不动!厂商憋出新招 当前热讯
这就是Intel显卡的意义!Arc A750限量版199美元史低价达成 天天热文
全球热点评!金钱树一次浇多少水_金钱树多久浇一次水
野生海参功效与作用_野生海参
丹丹看天气丨申城明天短时降温 后天重启入夏冲刺
焦点要闻:银行审核房贷一般几天 官方信息这样显示的
小清河6月底全线复航 可实现三种方式运输
审批时限缩短50%!云南省首个外国人才“一站式服务”专区启用
RTX 3070完全不是RTX 4060的对手!差距高下立判 天天速讯
世界讯息:5G芯片本土造!库克:苹果5年投3万亿 毫不动摇扶持美国制造
天天观焦点:OPPO Reno10系列关键参数汇总:全系标配长焦业界罕见
深圳降雨破历史纪录:今明两天广东局地雨势猛烈
FinClip助力房企数字化转型-独家
每日资讯:Graphpad Prism9.5.1 科研医学生物数据处理绘图软件安装教程 (含Win/Mac版)
双良节能(600481.SH)2022年度每股派0.3元 股权登记日为5月29日
迎战RTX 4060 Ti!撼讯AMD RX 6750 XT官降至2799元:性价比神了
网约车出现市场饱和与平台竞争加剧等问题 车辆数量高达230万
越南打工人整顿中国老板 5点半全体员工准时下班
英国一母亲发现10岁女儿偷偷氪金 求助BBC后火速获得退款
随着中国企业实力提升 韩国大宇造船海洋DSME正式更名
电影《长空之王》宣布密钥延期 由演员王一博与胡军主演
丰田首席科学家呼吁不要快过渡到电动车 呼吁给予混合动力车更长的时间
美国硅谷富豪为求抗衰老与永葆青春 与其儿子进行三代人的换血
世界短讯!08-避免Latch的产生
3)选课系统
移动政务服务提升突破口——小程序技术-天天新消息
Meta宣布开源大规模语言模型 可应对多达4000种以上音声语言识别
每日速讯:JDG夺冠故事公开,Ruler曾想过退役,被GEN放弃后,真的很难受