Java - Execl自定义导入、导出

1.需求:问卷星答 下图框出区域,为用户自定义字段问题及答案

在这里插入图片描述

2.采用技术EasyExcel

模板所在位置如下
在这里插入图片描述

/*** 导出模板** @param response*/
@Override
public void exportTemplate(HttpServletResponse response) throws IOException {ClassPathResource classPathResource = new ClassPathResource("templates/会员满意度调研.xlsx");StreamUtils.copy(classPathResource.getInputStream(),response.getOutputStream());
}
3.监听Listener继承AnalysisEventListener
导入模板数据时,所用的监听器
package com.huatek.frame.modules.survey.service.impl;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.ArrayList;
import java.util.Map;@Slf4j
public class SurveyImportMessageListener extends AnalysisEventListener<Object> {private final Logger logger = LoggerFactory.getLogger(this.getClass());private ArrayList<Object> datas = new ArrayList();/*** 表头*/private Map<Integer, String> headMap;public SurveyImportMessageListener() {}public void invoke(Object data, AnalysisContext analysisContext) {this.datas.add(data);
}public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {this.headMap = headMap;
}public void doAfterAllAnalysed(AnalysisContext context) {
}public ArrayList<Object> getDatas() {return this.datas;
}
public Map<Integer, String> getHead() {return this.headMap;
}
}
4.导入问卷
/*** 导入问卷** @param file* @param localUser* @return*/
@Override
public List<String> importSurvey(MultipartFile file, String surveyMainId,UserAuthProfileInfo localUser) {List<String> errorList = new ArrayList<>();try {SurveyImportMessageListener listener = new SurveyImportMessageListener();EasyExcel.read(file.getInputStream(), listener).sheet().doRead();ArrayList datas = listener.getDatas();Map<Integer, String> head = listener.getHead();LinkedList<SurveyProblemAnswerVO> surveyProblemAnswerVOS = new LinkedList();LinkedList<SurveyProblemAnswerItemVO> surveyProblemAnswerItemVOS = new LinkedList();head.forEach((key,value)->{//存储问题if(key >= 6){SurveyProblemAnswerItemVO item = new SurveyProblemAnswerItemVO();item.setProblem(value);item.setSortBy(key);surveyProblemAnswerItemVOS.add(item);}});for (Object data : datas) {SurveyProblemAnswerVO survey = new SurveyProblemAnswerVO();List<SurveyProblemAnswerItemVO> items = BeanListUtils.copyListProperties(surveyProblemAnswerItemVOS, SurveyProblemAnswerItemVO::new);survey.setSurveyMainId(surveyMainId);((LinkedHashMap<Integer, String>) data).forEach((key,value)->{if(key == 1) survey.setSubmitTime(DateUtil.parse(value,"yyyy/MM/dd HH:mm:ss"));if(key == 2) survey.setUseTime(value);if(key == 3) survey.setSource(value);if(key == 4) survey.setSourceInfo(value);if(key == 5) survey.setSourceIp(value);//存储问题答案if(key >= 6){SurveyProblemAnswerItemVO item = items.get(key-6);item.setAnswer(value);}});survey.setItemVOList(items);surveyProblemAnswerVOS.add(survey);}log.info("导入问答信息:{}", JSONArray.toJSONString(surveyProblemAnswerVOS));for (SurveyProblemAnswerVO surveyProblemAnswerVO : surveyProblemAnswerVOS) {SurveyMain surveyMain = surveyMainMapper.selectById(surveyMainId);if(surveyMain.getImportTime() == null){surveyMain.setImportTime(new Date());HttpServletRequest request = RequestHolder.getHttpServletRequest();JSONObject jsonObject = securityUser.currentUser(securityUser.getToken(request));surveyMain.setImportBy(jsonObject.get("userName").toString());surveyMainMapper.updateById(surveyMain);}SurveyProblemAnswer surveyProblemAnswer = new SurveyProblemAnswer();BeanUtils.copyProperties(surveyProblemAnswerVO,surveyProblemAnswer);surveyProblemAnswerService.saveOrUpdate(surveyProblemAnswer);List<SurveyProblemAnswerItemVO> itemVOList = surveyProblemAnswerVO.getItemVOList();itemVOList.forEach(item->item.setSurveyId(surveyProblemAnswer.getId()));List<SurveyProblemAnswerItem> surveyProblemAnswerItems = BeanListUtils.copyListProperties(itemVOList, SurveyProblemAnswerItem::new);surveyProblemAnswerItemService.saveOrUpdateBatch(surveyProblemAnswerItems);}} catch(Exception e){log.error("导入问卷异常",e);}return errorList;
}
5.根据模板导出数据
@Override
public void exportExcel(SurveyProblemAnswerVO vo, HttpServletResponse response) throws IOException {List<SurveyProblemAnswer> surveyProblemAnswers = surveyProblemAnswerMapper.selectList(new LambdaQueryWrapper<SurveyProblemAnswer>().eq(SurveyProblemAnswer::getSurveyMainId, vo.getId()));List<String> surveyIds = surveyProblemAnswers.stream().map(item -> item.getId()).collect(Collectors.toList());List<SurveyProblemAnswerItem> surveyProblemAnswerItems = surveyProblemAnswerItemMapper.selectList(new LambdaQueryWrapper<SurveyProblemAnswerItem>().in(SurveyProblemAnswerItem::getSurveyId, surveyIds));LinkedList<List<String>> head = new LinkedList<>();head.add(CollectionUtil.newArrayList("序号"));head.add(CollectionUtil.newArrayList( "提交答卷时间"));head.add(CollectionUtil.newArrayList( "所用时间"));head.add(CollectionUtil.newArrayList( "来源"));head.add(CollectionUtil.newArrayList( "来源详情"));head.add(CollectionUtil.newArrayList( "来源IP"));List<SurveyProblemAnswerItem>  problemItems = surveyProblemAnswerItems.stream().filter(item -> item.getSurveyId().equals(surveyProblemAnswers.get(0).getId())).sorted(Comparator.comparing(SurveyProblemAnswerItem::getSortBy)).collect(Collectors.toList());for (SurveyProblemAnswerItem item : problemItems) {head.add(CollectionUtil.newArrayList( item.getProblem()));}LinkedList<List<Object>> data = new LinkedList<>();int count = 0;for (SurveyProblemAnswer surveyProblemAnswer : surveyProblemAnswers) {List<Object> tmp = new ArrayList<>();tmp.add(++count);tmp.add(surveyProblemAnswer.getSubmitTime() == null ? "" : surveyProblemAnswer.getSubmitTime());tmp.add(surveyProblemAnswer.getUseTime() == null ? "":surveyProblemAnswer.getUseTime());tmp.add(surveyProblemAnswer.getSource() == null ? "":surveyProblemAnswer.getSource());tmp.add(surveyProblemAnswer.getSourceInfo() == null ? "":surveyProblemAnswer.getSourceInfo());tmp.add(surveyProblemAnswer.getSourceIp() == null ? "":surveyProblemAnswer.getSourceIp());List<SurveyProblemAnswerItem> items = surveyProblemAnswerItems.stream().filter(item -> item.getSurveyId().equals(surveyProblemAnswer.getId())).sorted(Comparator.comparing(SurveyProblemAnswerItem::getSortBy)).collect(Collectors.toList());for (SurveyProblemAnswerItem item : items) {if(StringUtils.isNotEmpty(item.getAnswer())){tmp.add(item.getAnswer());}else{tmp.add("");}}data.add(tmp);}EasyExcel.write(response.getOutputStream(),null).head(head).autoCloseStream(false).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("会员满意度调研模板").doWrite(data);
}

以上均为实现类,具体接口可参照定义

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置 Cmder 到鼠标右键

win Q 快捷键搜索 cmd&#xff0c;以管理员身份运行 在命令行输入 cmder.exe /REGISTER ALL

OpenCloudOS开源的操作系统

OpenCloudOS 是一款开源的操作系统&#xff0c;致力于提供高性能、稳定和安全的操作系统环境&#xff0c;以满足现代计算和应用程序的需求。它结合了现代操作系统设计的最新技术和实践&#xff0c;为开发者和企业提供了一个强大的平台。本文将详细介绍 OpenCloudOS 的背景、特性…

品牌进行3D数字化转型,有哪些优势?

各行业都在经历着从增量市场向存量市场的转变&#xff0c;同时用户的消费观念也日趋成熟&#xff0c;更加注重产品的体验和服务质量。 无论是线上购物平台还是线下实体门店&#xff0c;提供个性化和增强体验感的产品与服务已成为未来发展的核心驱动力&#xff0c;品牌转型也迫…

SyncFolders文件备份—办公人员必备

SyncFolders支持在两个或多个文件夹之间同步文件&#xff0c;用户可以将重要文件同步到多个位置&#xff0c;如备份硬盘、网络共享文件夹或云存储等。通过设定同步规则&#xff0c;可以自动备份和同步更新&#xff0c;减少手动操作的繁琐&#xff0c;确保文件的安全和可访问性。…

uniapp横屏移动端卡片缩进轮播图

uniapp横屏移动端卡片缩进轮播图 效果&#xff1a; 代码&#xff1a; <!-- 简单封装轮播图组件:swiperCard --> <template><swiper class"swiper" circular :indicator-dots"true" :autoplay"true" :interval"10000&quo…

软件必须要进行跨浏览器测试吗?包括哪些内容和注意事项?

随着互联网的普及和发展&#xff0c;用户对软件的要求越来越高。无论是在台式机、笔记本还是移动设备上&#xff0c;用户都希望能够以最好的体验来使用软件。然而&#xff0c;不同的浏览器在解析网页的方式、支持的技术标准等方面存在差异&#xff0c;这就导致了同一个网页在不…

fpga bitstream userid

fpga version register # xdc 文件 set_property BITSTREAM.CONFIG.USERID "0xDEADC0DE" [current_design] set_property BITSTREAM.CONFIG.USR_ACCESS 0x66669999 [current_design]ug908 在bit下载之后的property可以看到 &#xff0c;GUI里面Tools → Edit Devic…

QT项目实战:拼图小游戏

一、拼图智益-经典游戏&#xff08;开发环境&#xff09; 1&#xff1a;操作系统&#xff1a;Windows 10 x64专业版。 2&#xff1a;开发工具&#xff1a;Qt 5.12.8。 二、拼图智益-经典游戏&#xff08;功能模块&#xff09; 1&#xff1a;功能模块1&#xff1a;游戏启动…

1.1电路模型

1.1电路模型 任何实际电路由以下三部分组成&#xff1a; ①提供电能的能源 – 电源 ②用电装置 – 负载 ③传输电能的金属连线 – 导线 实际电路完成的功能&#xff1a;主要有以下两个方面&#xff1a; &#xff08;1&#xff09;进行能量的产生、传输和转换。&#xff08;如…

flash申请内存失败,导致老化问题解决

背景 在闪光灯初始化阶段客制化了一个buffer&#xff0c;下发到kernel的闪光灯驱动中用于保存读取闪光灯寄存器的值。功能测试都是正常的&#xff0c;但是一旦开始批量跑产线老化测试会有1/4500左右概率的后主摄拍照卡住。定位根因是闪光灯初始化失败&#xff0c;进一步原因就…

牛筋面,一口难忘的劲道滋味

在众多的平凉美食中&#xff0c;牛筋面以其独特的口感和丰富的口味&#xff0c;赢得了无数食客的喜爱。牛筋面&#xff0c;这一名字就给人一种坚韧、有嚼劲的印象。它并非由牛筋制成&#xff0c;而是因其面条的口感如牛筋般劲道而得名。牛筋面的制作过程颇具巧思。选用优质的面…

sheng的学习笔记-AI-K均值算法

ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识&#xff1a;聚类&#xff0c;可参考 sheng的学习笔记-聚类(Clustering)-CSDN博客 目录 什么是k均值算法 流程 伪代码 数据集 伪代码 代码解释 划分示意图 优化目标 随机初始化 选择聚类数…

鸿蒙期末项目(3)

服务器搭建完成之后&#xff0c;编写了诸多api用于数据传输工作&#xff08;略&#xff09; 编写完成之后&#xff0c;回到鸿蒙开发工具&#xff0c;开始编写搜索页面的代码。 打开搜索页面时&#xff0c;先会展示历史搜索记录&#xff08;如果有的话&#xff09;&#xff0c;…

Kafka入门到精通(四)-SpringBoot+Kafka

一丶IDEA创建一个空项目 二丶添加相关依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springf…

用户订单管理API:轻松管理,购物无忧

在当今数字化时代&#xff0c;电子商务已经成为人们购物的首选方式。与传统的实体店相比&#xff0c;电商的优势在于便捷、快速、多样化等特点&#xff0c;使得更多的消费者选择了通过网络购物。而作为电商平台&#xff0c;如何提供更好的购物体验&#xff0c;是每个平台都需要…

企业工程项目管理系统源码:Java版源码解析

一、项目概述 鸿鹄工程项目管理系统是基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技术栈&#xff0c;采用前后端分离架构构建的工程管理软件。它旨在应对企业快速发展中的管理挑战&#xff0c;提升工程管理效率&#xff0c;减轻工作负担&#xff0c;加速信息处理…

一次关于k8s的node节点NotReady的故障排查

master现象 分析 kubectl get nodes -A 看了下pod的状态&#xff0c;好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址&#xff0c;登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务&#xff…

基于SpringBoot的藏区特产销售平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot框架 工具&#xff1a; MyEclipse 系统展示 首页 个人中心 特产信息管理 订单管…

华宽通中标长沙市政务共性能力建设项目,助力智慧政务建设新飞跃

在数字化浪潮的推动下&#xff0c;长沙市政府正积极拥抱智慧城市建设&#xff0c;以科技力量提升政务服务效能。华宽通凭借其卓越的技术实力与丰富的项目经验&#xff0c;成功中标长沙市政务共性能力建设项目&#xff0c;这无疑是对华宽通在智慧城市领域实力的高度认可。 华宽…

背部筋膜炎最有效的治疗方法

背部筋膜炎的引起原因可以归结为多个方面&#xff0c;以下是详细的分点表示和归纳&#xff1a; 1、慢性劳损&#xff1a;长时间使用背部&#xff0c;如经常按摩背部&#xff0c;会导致筋膜老化、发炎&#xff0c;进而引发背部筋膜炎。症状可能包括背部疼痛、痉挛、肌肉无力感等…