easyPoi导出多sheet页 一个班级一张Sheet

需求:

  1. 某学校三年级共有三个班:三年一班、三年二班、三年三班
  2. 每个班有N个人

以班级为单位,导出所有人的名单,导出到一个Excel文件中,分不同的Sheet页

数据库表
在这里插入图片描述

数据
在这里插入图片描述
在这里插入图片描述
结果
在这里插入图片描述

Controller层

@GetMapping("exportMultiSheetClassWithStudents")
    public void exportMultiSheetClassWithStudents(HttpServletResponse response){

        List<Clazz> clazzList = clazzService.list();
        List<Long> clazzIds = clazzList.stream().map(e -> e.getClassId()).collect(Collectors.toList());
        if (CollectionUtil.isNotEmpty(clazzIds)){

             //用in一次查出,减少数据库查询次数
             LambdaQueryWrapper<Student> studentLambdaQueryWrapper =
                     new LambdaQueryWrapper<Student>().in(CollectionUtil.isNotEmpty(clazzList),Student::getClassId,clazzIds);
             List<Student> students = studentService.list(studentLambdaQueryWrapper);

             //Student->转StudentMultiSheetExportEntity
            List<StudentMultiSheetExportEntity> studentMultiSheetExportEntities = students.stream().map(e -> {

                StudentMultiSheetExportEntity studentMultiSheetExportEntity = new StudentMultiSheetExportEntity();
                BeanUtil.copyProperties(e, studentMultiSheetExportEntity);
                return studentMultiSheetExportEntity;

            }).collect(Collectors.toList());

            //根据班级分组
            Map<Long, List<StudentMultiSheetExportEntity>> studentMultiSheetMap = studentMultiSheetExportEntities.stream().collect(Collectors.groupingBy(StudentMultiSheetExportEntity::getClassId));

            // 将sheet1和sheet2使用得map进行包装
            List<Map<String, Object>> sheetsList = new ArrayList<>();
            for (Map.Entry<Long, List<StudentMultiSheetExportEntity>> studentListEntry : studentMultiSheetMap.entrySet()) {

                // 创建参数对象
                ExportParams exportParams = new ExportParams();
                String clazzName = studentListEntry.getKey()+"班";
                // 设置sheet得名称
                exportParams.setSheetName(clazzName);

                // 创建sheet使用得map
                Map<String,Object> dataMap = new HashMap<>(4);
                // title的参数为ExportParams类型
                dataMap.put("title",exportParams);
                // 对应的实体类型必须是带@Excel注解的实体不是数据库实体,用数据库实体会报错
                dataMap.put("entity", StudentMultiSheetExportEntity.class);
                // sheet中要填充得数据
                dataMap.put("data",studentListEntry.getValue());

                sheetsList.add(dataMap);
            }

            Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);

            ExcelUtil.downLoadExcel("学生信息"+ System.currentTimeMillis() +".xls",response,workbook);

        }


    }

student实体

@Data
@EqualsAndHashCode(callSuper = false)
public class Student implements Serializable {

    private static final long serialVersionUID = 1L;

    //这里要写,否则会报错
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    private Integer sex;

    private LocalDateTime birthDay;

    private LocalDateTime registrationDate;

    private Long classId;


}

StudentMultiSheetExportEntity实体

@Data
public class StudentMultiSheetExportEntity implements java.io.Serializable{

    /**
     * id
     */
    private Long id;
    /**
     * 学生姓名
     */
    @Excel(name = "学生姓名", height = 20, width = 30, isImportField = "true_st")
    private String        name;
    /**
     * 学生性别
     */
    @Excel(name = "学生性别", replace = { "男_1", "女_0" }, suffix = "生", isImportField = "true_st")
    private int           sex;

    @Excel(name = "出生日期", databaseFormat = "yyyy-MM-dd HH:mm:ss", format = "yyyy-MM-dd", isImportField = "true_st", width = 20)
    private LocalDateTime birthDay;

    @Excel(name = "进校日期", databaseFormat = "yyyy-MM-dd HH:mm:ss", format = "yyyy-MM-dd")
    private LocalDateTime registrationDate;

    @ExcelIgnore
    private Long classId;

}

ExcelUtil

public class ExcelUtil {

    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            // 告诉浏览器用什么软件可以打开此文件
            response.setHeader("content-Type", "application/vnd.ms-excel");
            //设置浏览器响应头对应的Content-disposition
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            //编码
            response.setCharacterEncoding("UTF-8");
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                workbook.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值