• EasyExcel 复杂数据导出


    因工作需要导出数据,导出到excel的格式如下:
    需求1:假设有A、B员工,那么就相当于有两张工作表【sheet】
    需求2:假设A员工要展示一年的工资,要那么同一工作表【sheet】就得有多个表
    在这里插入图片描述




    再此先奉献上EasyExcel语雀 或者 EasyExcel官网
    我最开始看的官网,但是官网又没有语雀写的多。但是耐不住官网的简洁。嗯…我觉得简洁

    一、根据文档写了个实体类

    package com.admin.ctt.entity.excelPojo;
    
    import com.alibaba.excel.annotation.ExcelProperty;
    import com.alibaba.excel.annotation.write.style.ColumnWidth;
    import com.alibaba.excel.annotation.write.style.ContentRowHeight;
    import com.alibaba.excel.annotation.write.style.HeadRowHeight;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    
    import java.util.Date;
    
    /**
     * 导出员工的合同提成及绩效
     * @author LunarYouI
     * @create 2022-06-28 17:05
     */
    
    @Data
    @EqualsAndHashCode
    //所有标题的高
    @HeadRowHeight(30)
    //所有内容的高
    @ContentRowHeight(25)
    //所有单元格列宽
    @ColumnWidth(25)
    public class EmployeeSalaryPojo {
    //    @ColumnWidth(50) //指定某一个单元格列宽
    //    @ExcelProperty({"员工工资表", "标题1", "合同提成/绩效", "字符串标题"})
    //    private String string;
    //
    //    @ExcelProperty({"员工工资表", "标题1", "合同提成/绩效", "日期标题"})
    //    private Date date;
    //
    //    @ExcelProperty({"员工工资表", "标题1", "合同提成/绩效", "数字标题"})
    //    private Double doubleData;
    
        //员工名称
        private String name;
        //员工日期
        private Date date;
        //员工工资
        private Double doubleData;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    二、参照文档写的两个方法,分别是标题数据

    • 标题这里我定义了两个人,分别是王某、李某,分别对应两个sheet
    /**
    	 * 数据
    	 * LunarYouI
    	 */
    	private static List<EmployeeSalaryPojo> data() {
    		List<EmployeeSalaryPojo> list = new ArrayList<>();
    		for (int i = 0; i < 10; i++) {
    			EmployeeSalaryPojo data = new EmployeeSalaryPojo();
    			data.setName("某人" + i);
    			data.setDate(new Date());
    			data.setDoubleData(0.56);
    			list.add(data);
    		}
    		return list;
    	}
    
    	/**
    	 * 标题
    	 * @return
    	 */
    	private static Map<String, List<List<String>>> head() {
    		String a = "管理员:张某   工资时间:2022.01    职位:员工/执行人   姓名:王某";
    		String b = "管理员:李某   工资时间:2022.01    职位:员工/执行人   姓名:李某";
    		Map<String, List<List<String>>> mp = new HashMap<>();
    		/**
    		 * 人1
    		 */
    		List<List<String>> head = new ArrayList<>();
    		List<String> list1 = new ArrayList<>();
    		list1.add("员工工资表");
    		list1.add(a);
    		list1.add("合同提成/绩效");
    		list1.add("员工名称");
    		head.add(list1);
    		List<String> list2 = new ArrayList<>();
    		list2.add("员工工资表");
    		list2.add(a);
    		list2.add("合同提成/绩效");
    		list2.add("员工日期");
    		head.add(list2);
    		List<String> list3 = new ArrayList<>();
    		list3.add("员工工资表");
    		list3.add(a);
    		list3.add("合同提成/绩效");
    		list3.add("员工工资");
    		head.add(list3);
    		mp.put("r1",head);
    		/**
    		 * 人2
    		 */
    		List<List<String>> head1 = new ArrayList<>();
    		List<String> list4 = new ArrayList<>();
    		list4.add("员工工资表");
    		list4.add(b);
    		list4.add("合同提成/绩效");
    		list4.add("员工名称");
    		head1.add(list4);
    		List<String> list5 = new ArrayList<>();
    		list5.add("员工工资表");
    		list5.add(b);
    		list5.add("合同提成/绩效");
    		list5.add("员工日期");
    		head1.add(list5);
    		List<String> list6 = new ArrayList<>();
    		list6.add("员工工资表");
    		list6.add(b);
    		list6.add("合同提成/绩效");
    		list6.add("员工工资");
    		head1.add(list6);
    		mp.put("r2",head1);
    		return mp;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    三、【多个sheet】参照EasyExcel官网导出数据在不同sheet上

    	public static void simpleWrite() {
    		ExcelWriter excelWriter = null;
    		// 方法2: 如果写到不同的sheet 同一个对象
    		String fileName = "F:\\temporary\\" + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
    		// 这里 指定文件
    		try {
    			excelWriter = EasyExcel.write(fileName, EmployeeSalaryPojo.class).build();
    			// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
    			for (int i = 0; i < 5; i++) {
    				// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
    				WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
    				//写入到excel和上面空开几行
    				writeSheet.setRelativeHeadRowIndex(1);
    				// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
    				List<EmployeeSalaryPojo> data = data();
    				excelWriter.write(data, writeSheet);
    			}
    		} finally {
    			if(excelWriter!=null){
    				excelWriter.finish();
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这里没有标题是因为 EmployeeSalaryPojo实体类中的前字段三个被注释了,解开前三个注释后三个就可以了
    在这里插入图片描述

    四、【同一sheet多个表】

    public static void simpleWrite() {
    		ExcelWriter excelWriter = null;
    		// 方法2: 如果写到不同的sheet 同一个对象
    		String fileName = "F:\\temporary\\" + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
    		// 这里 指定文件
    		try {
    			excelWriter = EasyExcel.write(fileName, EmployeeSalaryPojo.class).build();
    			// 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
    			WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build();
    			//距离上边空一行
    			writeSheet.setRelativeHeadRowIndex(10);
    			// 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
    			WriteTable writeTable0 = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build();
    			WriteTable writeTable1 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
    			// 第一次写入会创建头
    			excelWriter.write(data(), writeSheet, writeTable0);
    			// 第二次写如也会创建头,然后在第一次的后面写入数据
    			excelWriter.write(data(), writeSheet, writeTable1);
    		} finally {
    			if(excelWriter!=null){
    				excelWriter.finish();
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    五、【Excel中多个sheet,并且一个sheet多个表】

    	public static void simpleWrite() {
    		ExcelWriter excelWriter = null;
    		// 方法2: 如果写到不同的sheet 同一个对象
    		String fileName = "F:\\temporary\\" + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
    		// 这里 指定文件
    		try {
    			excelWriter = EasyExcel.write(fileName, EmployeeSalaryPojo.class).build();
    			//设置动态标题
    			Map<String, List<List<String>>> head = head();
    			int i = 0;
    			for (String key : head.keySet()) {
    				i++;
    				/**
    				 * 1、获取到value; 获取到的List<List<String>>就表示是同一个sheet的数据
    				 */
    				List<List<String>> lists = head.get(key);
    				// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样【这里必须要加.needHead(Boolean.FALSE),否则会多处标题而没数据】
    				WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).needHead(Boolean.FALSE).build();
    				//动态标题
    				writeSheet.setHead(lists);
    				//写入到excel和上面空开几行
    				writeSheet.setRelativeHeadRowIndex(1);
    
    				/**
    				 * 2、相同数据写在同一个sheet里面
    				 * 这里的j表示1个sheet会有几个表单数据
    				 */
    				for (int j = 0;j<3;j++) {
    					WriteTable writeTable = EasyExcel.writerTable(j).needHead(Boolean.TRUE).build();
    					excelWriter.write(data(), writeSheet, writeTable);
    				}
    			}
    		} finally {
    			if(excelWriter!=null){
    				excelWriter.finish();
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

  • 相关阅读:
    北大邹磊:图数据库中的子图匹配算法
    数据结构精讲(清华版)
    MasaFramework -- 更优雅的获取配置信息
    OA项目之待开会议&历史会议&所有会议
    【微信小程序】2023年11月版本 关于小程序隐私保护指引设置的公告 | 修改微信小程序隐私保护 |小程序无法获取用户昵称 头像 性别 等问题
    助力水泥基建裂痕自动化巡检,基于yolov5融合ASPP开发构建多尺度融合目标检测识别系统
    从0实现线性回归
    戏说领域驱动设计(廿六)——再谈事务
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java手工艺品在线网站k5284
    【暑期每日一题】洛谷 P8086 『JROI-5』Music
  • 原文地址:https://blog.csdn.net/qq_46100517/article/details/125522869