EasyExcel用模版导出动态表格

在工作中有这么一个需求就是导出一个表格,上面有学生的信息下面有一个表格记录学生每科的成绩,要导出这样一个表格我们要怎么做呢?其实很简单,可以用导出模版做到,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();
	}
}

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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
EasyExcel可以通过模板导出Excel文件。可以使用EasyExcel提供的TemplateExcelUtils工具类来实现。首先,你需要准备好一个包含模板Excel文件,模板中可以包含图片、表格和其他内容。然后,你可以在Controller层编写一个方法,使用@RequestParam注解获取前端传过来的文件和其他参数。在这个方法中,调用Service层的export方法来实现导出。在ServiceImpl中,可以使用EasyExcel的相关API来读取模板文件,并将数据写入到模板中的指定位置。最后,将生成的Excel文件通过HttpServletResponse返回给前端。这样,你就可以通过模板导出Excel文件了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [EasyExcel根据自定义模板导出Excel(包含图片、表格)](https://blog.csdn.net/ViperWhip/article/details/128292654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [EasyExcel 动态表头 导出](https://download.csdn.net/download/tianyitianshangyuan/13129273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力发光的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值