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();
            }
        }
    }

}
相关推荐
2501_930707784 小时前
使用C#代码在 Excel 中添加或设置批注格式
excel
梦因you而美7 小时前
Python win32com 复制Excel sheet优化:覆盖替换而非删除重建,彻底解决公式报错
python·excel·win32com·python自动化·批量复制sheet表
asdzx678 小时前
使用 C# 将 Excel 转换成高质量 JPG
开发语言·c#·excel
城数派8 小时前
2014-2025年全国监测站点的逐月空气质量数据(15个指标\Excel\Shp格式)
arcgis·信息可视化·数据分析·excel
Metaphor6921 天前
使用 Python 操作 Excel 文件中的工作表(添加和删除)
python·excel
开开心心就好1 天前
支持自定义名单的实用随机抽签工具
windows·计算机视觉·计算机外设·excel·散列表·启发式算法·csdn开发云
李昊哲小课2 天前
Python办公自动化教程 - 第2章 单元格样式魔法 - 让表格变得美观专业
开发语言·python·excel·openpyxl
孙同学20202 天前
如何将 JSON 数据转换为 Excel 工作表
python·json·excel
奔跑的呱呱牛2 天前
前端/Node.js操作Excel实战:使用@giszhc/xlsx(导入+导出全流程)
前端·node.js·excel·xlsx·sheetjs
Metaphor6923 天前
使用 Python 设置 Excel 表格的行高与列宽
开发语言·python·excel