EasyExcel用模版导出动态表格

news2025/6/15 17:12:32

在工作中有这么一个需求就是导出一个表格,上面有学生的信息下面有一个表格记录学生每科的成绩,要导出这样一个表格我们要怎么做呢?其实很简单,可以用导出模版做到,Easyexcel已经有实现方法了,下面我们来一步一步的实现这个需求。

image-20240411164617557

一、环境准备

引入依赖

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>3.3.2</version>
</dependency>

准备模版

image-20240411165229155

模版有点丑哈,但是不重要,自己想怎么调就怎么调。但是呢就是要注意列表的那边是有一个.的。

二、代码编写

  void templateExportTest() throws IOException {
        HashMap<String,Object> map=new HashMap<>();
        map.put("studentName","小温");
        map.put("gender", "男");
        map.put("opid",1234554);
        map.put("semester","2024-2023-1");
        map.put("className","计算机一班");
        List<StudentCourseDTO> exportList=new ArrayList<>();
        for (int i=1;i<2;i++){
           exportList.add(StudentCourseDTO.builder().index(i).courseName("物理")
                   .credits("4").normalScore("4").courseCredits("4")
                   .normalScoreGpa("4")
                   .normalSemester("2024-2023-1").build());
        }

        String fileName ="D:/export/导出数据. "+ ".xlsx";
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("导出模版.xls");
        //设置创建行的方式
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(is).excelType(ExcelTypeEnum.XLS).build();
        //写入到sheet
        WriteSheet oneSheet = EasyExcel.writerSheet(0).build();
        //填充
        excelWriter.fill(map, oneSheet);
        excelWriter.fill(exportList, fillConfig, oneSheet);
        excelWriter.finish();

        assert is != null;
        is.close();
 	}

三、具体实现

public void exportStudentCourseDetail(AnalyseStudentScoresPagingDTO dto,
										  HttpServletResponse response) {
		StudentInfoDTO studentInfo = subjectDao.getStudentInfo(dto.getSubjectId());
		AtomicInteger index= new AtomicInteger();
		this.setStudentCode(dto);
		// 获得所有原始记录信息
		List<StudentScoresCourseDetailDTO> detailList = analyseStudentScoresSemesterDao.pagingCourseDetail(dto);
		// 转换为导出对象
		List<ExportScoresCourseDetailDTO> exportList = detailList.stream().map(item -> {
			ExportScoresCourseDetailDTO exportDto = new ExportScoresCourseDetailDTO();
			exportDto.setIndex(index.incrementAndGet());
			exportDto.setIsPass(ScoreDef.IsPass.from(item.getIsPass()).getName());
			BeanUtils.copyProperties(item, exportDto);
			return exportDto;
		}).collect(Collectors.toList());
		String fileName = UUID.randomUUID() + ".xls";
		// 拼装表头上面的数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("studentName",studentInfo.getStudentName());
		map.put("gender", SubjectDef.Gender.fromCode(studentInfo.getGender()).getName());
		map.put("opid",studentInfo.getOpid());
		map.put("semester",dto.getSemester());
		map.put("className",studentInfo.getGradeName()+"/"+studentInfo.getInstituteName()+"/"+studentInfo.getMajorName()+"/"+studentInfo.getClassName());
		// 从阿里云导出
		try {
			InputStream is = this.getClass().getClassLoader().getResourceAsStream("templates/"+"学生成绩明细信息导出模版.xls");
//			InputStream is = ossFileService.download(ossProperties, "学生成绩明细信息导出模版.xls", 1);
			EasyExcelUtils.templateWrite(fileName,exportList,is,map,response);
		}catch (Exception e){
			throw new BadRequestException("下载模版文件失败");
		}
		// 发送消息
		String userName = SecurityUtils.getUser().getName();
		String newFileName = "学生成绩明细信息"+UUID.randomUUID() + ".xls";
		remoteBigDataExportDangerMsgService.sendBigDataExportDanger(userName, newFileName, SecurityConstants.FROM_IN);
	}

这里因为是要与前端交互,返回一个把我们导出的文件写到response,最后我封装了一下代码这样方便以后调用。

public class EasyExcelUtils {
	private EasyExcelUtils() {
	}
	public static <T> void templateWrite(String fileName, List<T> exportList, InputStream is, HashMap<String,Object> map, HttpServletResponse response){
		try {
			OutputStream os = getOutputStream(fileName,response);
			//设置创建行的方式
			FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
			ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(is).excelType(ExcelTypeEnum.XLS).build();
			//写入到sheet
			WriteSheet oneSheet = EasyExcel.writerSheet(0).build();
			//填充
			excelWriter.fill(map, oneSheet);
			excelWriter.fill(exportList, fillConfig, oneSheet);
			excelWriter.finish();
			os.close();
			is.close();
		}catch (Exception e){
			String msg = "export occur error";
			throw new BadRequestException(msg);
		}
	}
	private static OutputStream getOutputStream(String fileName,
												HttpServletResponse response) throws Exception {
			fileName = URLEncoder.encode(fileName, "UTF-8");
			response.setContentType("application/vnd.ms-excel");
			response.setCharacterEncoding("utf8");
			response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");
			response.setHeader("Pragma", "public");
			response.setHeader("Cache-Control", "no-store");
			response.addHeader("Cache-Control", "max-age=0");
			return response.getOutputStream();
	}
}

我的实现过程大概就是这样了,写的代码不是很规范,希望能得到大家的指导。

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

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

相关文章

【Python数据分析】让工作自动化起来,无所不能的Python

这里写目录标题 前言一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一编辑推荐内容简介作者简介前言读者对象如何阅读本书目录 前言 随着我国企业数字化和信息化的深入&#xff0c;企业对…

3dmax2024渲染大图高清参数,3dmax效果图渲染设置

2024版的3ds Max带来了更为强大的渲染工具和优化的参数设置&#xff0c;使得设计师能够创造出令人惊叹的视觉作品&#xff0c;何利用3ds Max 2024的先进功能&#xff0c;精心调整渲染参数&#xff0c;以实现高分辨率、高质量的效果图输出&#xff0c;满足专业设计和视觉表现的需…

4.Spring IoCDI

文章目录 1.Ioc - 控制反转(解耦)1.1传统开发1.2批量生产车轮(修改代码) - 传统方式&#xff0c;繁琐1.3解耦1.3.1使用Ioc方法后1.3.2添加变量颜色 只需要修改Tire即可 1.4Bean的存储1.4.1Controller(控制器存储)1.4.2Service(服务存储)1.4.2.1根据context来获取bean1.4.2.2根据…

实战篇06:更新用户头像

实战篇06&#xff1a;更新用户头像 一、接口信息 1.1 基本信息 请求路径&#xff1a;/user/updateAvatar 请求方式&#xff1a;PATCH 接口描述&#xff1a;该接口用于更新已登录用户的头像 1.2 请求参数 请求参数格式&#xff1a;queryString 请求参数说明&#xff1a; 参…

【C语言】万字讲解函数栈帧的创建与销毁

目录 前言 一、什么是函数栈帧&#xff1f; 二、理解函数栈帧能解决什么问题呢 三、函数栈帧的创建和销毁解析 3.1 什么是栈&#xff1f; 3.2 认识相关寄存器和汇编指令 3.3 剖析函数栈帧的创建和销毁 3.3.1 esp寄存器与ebp寄存器的重要性 3.3.2 函数的调用堆栈 3.3.…

SUV新车首发在即,车载随身wifi受追捧!格行随身wifi怎么样?

眼看距离2024年北京车展开幕越来越近&#xff0c;有关各家车企的新车消息也是层出不穷&#xff0c;今年的北京车展到底还有哪些重磅新车呢&#xff1f; 吉利银河E5车展动作&#xff1a;首发车型特点&#xff1a;全新纯电动SUV 此前&#xff0c;吉利全新纯电动SUV——吉利银河…

MySql数据库从0-1学习-第三天多表设计学习

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种: 一对多(多对一)多对多一对一 一对多 需求:根据需求,完成部门和员工表的设计 一对多,很多人会使用外键,…

IP查询在追踪网络攻击源头中的应用

随着网络攻击事件的不断增加&#xff0c;追踪攻击源头成为网络安全领域的重要任务之一。IP查询技术通过分析网络流量中的IP地址&#xff0c;可以帮助确定攻击的来源。本文将探讨IP查询在追踪网络攻击源头中的应用&#xff0c;包括其原理、方法以及实际案例分析。 IP地址查询&a…

道可云文旅元宇宙平台:全面赋能文旅产业数字化转型

随着科技的迅猛发展&#xff0c;元宇宙、人工智能和虚拟数字人等技术逐渐成为推动社会进步的重要力量。在这一背景下&#xff0c;道可云文旅元宇宙平台以其独特的创新理念和前沿技术&#xff0c;为数字文博领域带来了革命性的变革。 道可云文旅元宇宙平台运用先进的元宇宙、人…

【软考---系统架构设计师】计算机网络章节

目录 一、TCP/IP协议族 &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;TCP和UDP的区别 &#xff08;3&#xff09;DNS协议 &#xff08;4&#xff09;DHCP协议 二、网络规划与设计 &#xff08;1&#xff09;需求分析 &#xff08;2&#xff09;通信规范…

OpenResty,Nginx实现接口验签与黑名单控制

介绍 nginx与openresty是两种优秀知名的7层负载均衡软件&#xff0c;nginx以其出色的性能和稳定性成为首选&#xff0c;而openresty则是在Nginx基础上构建的&#xff0c;支持嵌入Lua语言&#xff0c;大幅提升了开发效率。 安装OpenResty 版本 openresty-1.25.3.1-win64下载地…

【leetcode面试经典150题】36. 旋转图像(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

OSCP靶场--Dibble

OSCP靶场–Dibble 考点(前端鉴权参数修改node.js代码注入 suid cp提权 ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.110 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-09 06:36 EDT Nmap scan repor…

一种快速移植 OpenHarmony Linux 内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者&#xff0c;介绍一种借助三方芯片平台自带 Linux 内核的现有能力&#xff0c;快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

软件本地化:步骤、成本和障碍

瓦莱丽娅舍斯托博耶娃&#xff0c;Logrus IT翻译部门的经理&#xff0c;谈论了我们公司的运作方式、软件本地化是什么以及为什么它如此重要。 你能告诉我一些关于你们公司的情况吗&#xff0c;瓦莱丽娅&#xff1f;它做什么&#xff0c;成立多久了&#xff1f; Logrus IT今年…

袋鼠云春季发布会圆满落幕,构建Data+AI新质生产力

4月10日&#xff0c;以“DataAI&#xff0c;构建新质生产力”为主题的袋鼠云春季发布会圆满落幕。大会中&#xff0c;袋鼠云带来了一系列“AI”的数字化产品与最新行业沉淀&#xff0c;旨在将数据与AI紧密结合&#xff0c;打破传统的生产力边界&#xff0c;赋能企业实现更高质量…

基于springboot实现音乐网站管理系统项目【项目源码+论文说明】

基于SpringBoot实现音乐网站管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐…

【pinia学习】pinia课程学习笔记

课程地址&#xff1a; VUE新一代状态管理工具Pinia超详细基础入门 贴两个链接&#xff1a; vue3官方文档 pinia官方文档 P1 《pinia的简介》 不得不说“开卷有益&#xff0c;学有所获”&#xff0c;前两天自己找pinia的官方文档好像也没找对&#xff0c;原来在vue3官方生态系…

万象皆歌everySings音乐与AI技术的邂逅,内测启动

在这个快节奏的数字时代&#xff0c;音乐依然扮演着连接人心、传递情感的重要角色。然而&#xff0c;音乐创作往往被视为门槛较高的艺术形式&#xff0c;需要复杂的理论知识和漫长的实践经验。但现在&#xff0c;随着人工智能技术的不断进步&#xff0c;让大众对音乐的获悉和交…

消息的可靠性·

面试题&#xff1a;Rabbitmq怎么保证消息的可靠性? 1.消费端消息可靠性保证&#xff1a; 消息确认&#xff08;Acknowledgements&#xff09;&#xff1a; 消费者在接收到消息后&#xff0c;默认情况下RabbitMQ会自动确认消息&#xff08;autoAcktrue&#xff09;。为保证消…