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

需求:

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

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

数据库表

数据

结果

Controller层

java 复制代码
@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实体

java 复制代码
@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实体

java 复制代码
@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

java 复制代码
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();
            }
        }
    }

}
相关推荐
hqyjzsb3 小时前
从爱好到专业:AI初学者如何跨越CAIE认证的理想与现实鸿沟
大数据·c语言·人工智能·信息可视化·职场和发展·excel·业界资讯
vfvfb9 小时前
excel对比找不同人名 双xlsx双列对比
excel·excel多列对比
課代表1 天前
Excel VBA 为数据赋予随机浅色标记
excel·vba·可视化·条件格式·标记·对比·随机
kylezhao20191 天前
C#上位机开发数据持久化:excel报表导入导出
开发语言·c#·excel
悟能不能悟1 天前
springboot controller返回的是HttpServletResponse成功返回excel文件流,失败就返回失败参数
spring boot·后端·excel
野比带雄2 天前
対excel时间格式的理解
excel
缺点内向2 天前
Java:轻松实现 Excel 文档属性添加
java·开发语言·excel
Teable任意门互动2 天前
从飞书多维表格 简道云到Teable多维表格:企业为何选择Teable作为新一代智能数据协作平台?
数据库·excel·钉钉·飞书·开源软件
AC赳赳老秦2 天前
DeepSeek + Excel 实战:多表联动分析与异常数据自动预警教程
microsoft·rabbitmq·excel·etcd·memcached·memcache·deepseek
2501_930707782 天前
如何使用C#代码将 Excel 文件转换为 SVG
开发语言·c#·excel