hutool文件导出

news/2024/11/16 22:30:13/

hutool文件导出

需求:管理员设置会议,参加会议会根据管理员设置的会议要求,用户参加会议填写相关数据,并且生成一个动态的excel数据并导出

示例:
每场都可以自定义报名字段
在这里插入图片描述
根据需求与前端约定
字段名称(name)
字段类型(type):select-下拉框;fill-填空。
是否必填(required)
字段属性(attribute)
下拉框:single-单选;multiple-多选。
填空:text-⽂本;number-数字。
额外字段
下拉框:options-选项
填空:length-字段长度
字段返回示例:

[{"name":"姓名","type":"fill","required":true,"attribute":"text","length":"10"},{"name":"工作单位","type":"fill","required":true,"attribute":"text","length":"20"},{"name":"电话","type":"fill","required":true,"attribute":"number","length":"20"},{"name":"会议类型","type":"select","required":true,"attribute":"single","options":["考务会","审稿会"]},{"name":"科目","type":"select","required":false,"attribute":"single","options":["语文","数学","英语","物理","历史","化学","地理","政治","生物"]},{"name":"是否住宿","type":"select","required":true,"attribute":"single","options":["是","否"]},{"name":"性别","type":"select","required":false,"attribute":"single","options":["男","女"]}
]

用户填写参数示例:

{"姓名":"小猪猪","电话":"1734765xxxx","工作单位":"xxx有限公司","会议类型":"考务会","是否住宿":"是","性别":"男"
}

需要生成的报表示例:
序号、报名时间与签到时间是必须有的
在这里插入图片描述

使用hutool的工具ExcelUtil

  • 导包
	<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.6</version></dependency>
  • 业务代码
   /*** 导出用户报名信息* conference.getApplyFields() 这个数据示例:* [{"name": "姓名","type": "fill","required": true,"attribute": "text","length": "10"},{"name": "工作单位","type": "fill","required": true,"attribute": "text","length": "20"},{"name": "电话","type": "fill","required": true,"attribute": "number","length": "20"},{"name": "会议类型","type": "select","required": true,"attribute": "single","options": ["考务会","审稿会"]},{"name": "科目","type": "select","required": false,"attribute": "single","options": ["语文", "数学", "英语","物理","历史","化学","地理","政治","生物"]},{"name": "是否住宿","type": "select","required": true,"attribute": "single","options": ["是", "否"]},{"name": "性别","type": "select","required": false,"attribute": "single","options": ["男", "女"]}]* *conferenceApply.getInformation()这个数据示例:*{"姓名":"小猪猪","电话":"1734765xxxx","工作单位":"xxx有限公司","会议类型":"考务会","是否住宿":"是","性别":"男"}** @param query 搜索信息* @return String*/@Overridepublic void conferenceApplyExport(ConferenceApplyListQuery query) throws IOException {// 查询会议信息Conference conference = conferenceMapper.selectOne(new LambdaQueryWrapper<Conference>().eq(Conference::getConferenceId, query.getConferenceId()).select(Conference::getApplyFields));Assert.isTrue(ObjectUtil.isNull(conference), "未找到该会议信息!");List<ConferenceApply> conferenceApplyList = conferenceApplyMapper.listQuery(query);Assert.isTrue(CollectionUtil.isEmpty(conferenceApplyList), "未找到相关数据");ExcelWriter writer = ExcelUtil.getWriter();List<Map<String, String>> rows = new ArrayList<>();List<Object> list = JSONUtil.parseArray(conference.getApplyFields());List<String> names = new ArrayList<>();for (Object o : list) {Map<String, String> map = (Map<String, String>) JSONUtil.parse(o);names.add(map.get("name"));}int number = 1;DateTimeFormatter simpleDateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");for (ConferenceApply conferenceApply : conferenceApplyList) {Map<String, String> maps = new HashMap<>();maps.put("number", Integer.toString(number));Map<String, String> map = (Map<String, String>) JSONUtil.parse(conferenceApply.getInformation());// 填充空白数据names.forEach(x -> {if (!map.containsKey(x)) {map.put(x, "/");}});maps.putAll(map);// 报名时间maps.put(ConferenceEnum.gmt_apply.getName(), simpleDateFormat.format(conferenceApply.getGmtApply()));// 签到时间maps.put(ConferenceEnum.gmt_sign.getName(), ObjectUtil.isNotEmpty(conferenceApply.getGmtSign())? simpleDateFormat.format(conferenceApply.getGmtSign()) : "");rows.add(maps);number++;}// 报名时间names.add(ConferenceEnum.gmt_apply.getName());// 签到时间names.add(ConferenceEnum.gmt_sign.getName());// Titlewriter.merge(names.size(), "会议报名表");// Headerwriter.addHeaderAlias("number", "序号");writer.setColumnWidth(0, 20);int num = 1;for (String key : names) {// 设置表头writer.addHeaderAlias(key, key);// 设置行间距writer.setColumnWidth(num, 20);num++;}writer.write(rows, true);response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("conferenceApplyTable" + DateUtil.today() + ".xls", "utf-8"));ServletOutputStream out = response.getOutputStream();writer.flush(out, true);writer.close();IoUtil.close(out);}

效果:
在这里插入图片描述


http://www.ppmy.cn/news/146753.html

相关文章

Vue3-01-Vue3 新特性及环境搭建

Vue.js是一种被广泛使用的JavaScript框架&#xff0c;用于构建用户界面和单页面应用。Vue3是其最新的主要版本&#xff0c;引入了许多新特性并做了一些改进。 一、Vue3 性能提升 1. Object.defineProperty VS Proxy Vue2 和 Vue3 在数据响应性系统的实现上采用了不同的方式&…

深度学习 - 53.Bert 简介与 Keras-Bert 常用示例

目录 一.引言 二.Bert 简介 1.Embedding Layer 2.Encoder layer 3.Pre-training 与 Fine-Tuning 三.Keras-Bert 常用 Demo 1.获取预训练模型 2.加载预训练模型 3.Fill Text 4.IsCorrelation 5.Get Embedding 6.完整代码 四. Fine-Tuning 五.Bert VS OpenAI GPT …

T100报错

今天T100系统老是报错 提示 查无此笔 资料 后来 调试发现是 insert xrcd表报错 把语句拉出来 拿到数据库后 提示空间不足&#xff0c;发给运维好了。加了表空间就好了 查询表空间SQL SELECT a.tablespace_name "表空间名称", total / (1024 * 1024) "表空间…

Java、储物柜难题

一个学校有100个储物柜和100个学生。所有的储物柜在上学的第一天都是关着的。随着学生进入&#xff0c;第一个学生S1打开了每个柜子。第二个学生S2从第二个柜子L2开始&#xff0c;关闭相隔1的柜子。学生3&#xff08;S3&#xff09;从第三个柜子L3改变每第三个柜子的状态&#…

LE5010

LE5010是凌思微出的集成BLE功能芯片 参考文档&#xff1a;https://ls-ble-sdk.readthedocs.io/zh/latest/index.html 参数 32位Cortex-M0内核&#xff0c;最高频率64M&#xff0c;最大64KB SRAM&#xff0c;最大512KB flash。支持BLE5.0/5.1&#xff0c;支持MESH。 低功耗功…

数据可视化 立体柱状图 柱状图

立体柱状图 1、首先通过标签方式直接引入构建好的 echarts 文件 <!DOCTYPE html> <html> <head><meta charset"utf-8"><!-- 引入 ECharts 文件 --><script src"echarts.min.js"></script> </head> <…

HTML5(九)——超强的 SVG 动画

SVG 动画有很多种实现方法&#xff0c;也有很大SVG动画库&#xff0c;现在我们就来介绍 svg动画实现方法都有哪些&#xff1f; 一、SVG 的 animation SVG animation 有五大元素&#xff0c;他们控制着各种不同类型的动画&#xff0c;分别为&#xff1a; setanimateanimateCo…

打印机配置及故障排查解决方案

爱普生 M系列机型打印输出有空白条纹或模糊不清&#xff0c;如何解决&#xff1f; - 爱普生产品常见问题 - 爱普生中国 L系列机型打印输出有空白条纹或严重偏色&#xff0c;如何解决&#xff1f;(无运输锁) - 爱普生产品常见问题 - 爱普生中国 爱普生系列配网及微信打印 联…