EasyExcel导出多个sheet封装

导出多个sheet

在需求中,会有需要导出多种sheet的情况,那么这里使用easyexcel进行整合

步骤

1、导入依赖
xml 复制代码
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>
2、Sheet类

主要封装了需要导出的sheet,类,数据等

java 复制代码
package com.eshore.easyexcel.entity;

import lombok.Builder;
import lombok.Data;

import java.util.List;

@Data
public class SheetInfoBean<T> {

    /**
     * sheet页名称
     */
    private String sheetName;

    /**
     * sheet标题bean
     */
    private Class<?> headClass;

    /**
     * sheet页数据
     */
    private List<T> dataList;


    public SheetInfoBean(String sheetName, Class<?> headClass, List<T> dataList) {
        this.sheetName = sheetName;
        this.headClass = headClass;
        this.dataList = dataList;
    }
}
3、导出方法
java 复制代码
package com.eshore.easyexcel.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.eshore.easyexcel.entity.SheetInfoBean;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class EasyExcelUtils {

    private final static String XLSX=".xlsx";



    /**
    * author:walker
    * time: 2024/6/4
    * description:  导出文件
     * prefix:前缀 如: D:/hello/
     * title:文件名称 如: test
     * @return
     */
    public static String exportFile(List<SheetInfoBean> sheetInfoBeans,
                                    String prefix,
                                    String title
    ){
        // 导出文件
        String path=prefix+title+XLSX;
        File dir = new File(prefix);
        if(!dir.exists()){
            dir.mkdirs();
        }
        File file = new File(path);
        try(ExcelWriter excelWriter = EasyExcel.write(file).build()) {
            WriteSheet writeSheet;
            List<String> exclueFields = new ArrayList<>();
            for (SheetInfoBean bean : sheetInfoBeans) {
                Class<?> headClass = bean.getHeadClass();
                Field[] declaredFields = headClass.getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    ExcelProperty annotation = declaredField.getAnnotation(ExcelProperty.class);
                    if(annotation==null) {
                        exclueFields.add(declaredField.getName());
                    }
                }

                // 构建sheet对象
                writeSheet = EasyExcel.writerSheet(bean.getSheetName()).head(bean.getHeadClass()).excludeColumnFieldNames(exclueFields).build();
                // 写出sheet数据
                excelWriter.write(bean.getDataList(), writeSheet);
            }
            // 关流
            excelWriter.finish();
        } catch (Exception e) {
            log.error("导出失败,原因如下:",e);
            // do something you want
        }
        return path;
    }
}

注意:

里面做了一个处理,就是当没有@ExcelProperty的时候,该字段则不导出,否则需要对字段进行excludeColumnFieldNames的设置。相对来说麻烦一些

4、案例

需要使用@ExcelProperty对属性进行配置

1、学生类

java 复制代码
package com.walker.sample.easyexcel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class Student {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
}

2、老师类

java 复制代码
package com.walker.sample.easyexcel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class Teacher {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
}

3、测试方法

java 复制代码
package com.walker.sample.easyexcel;

import easyexcel.entity.SheetInfoBean;
import easyexcel.utils.EasyExcelUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@SpringBootTest
public class EasyExcelTest {

    @Test
    public void export(){

        List<Student> students = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Student student = new Student();
            student.setName("学生"+i);
            student.setAge(i);
            students.add(student);
        }

        List<Teacher> teachers = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Teacher teacher = new Teacher();
            teacher.setName("老师"+i);
            teacher.setAge(i);
            teachers.add(teacher);
        }



        List<SheetInfoBean> sheetInfoBeans = new ArrayList<>();
        sheetInfoBeans.add(new SheetInfoBean("学生",Student.class,students));
        sheetInfoBeans.add(new SheetInfoBean("老师",Teacher.class,teachers));


        String prefix="D:/";
        EasyExcelUtils.exportFile(sheetInfoBeans,prefix,"学生老师表");
    }
}

4、导出结果

相关推荐
非凡ghost11 小时前
猫眼浏览器(Chrome内核增强版浏览器)官方便携版
前端·网络·chrome·windows·软件需求
熊文豪16 小时前
Windows安装RabbitMQ保姆级教程
windows·分布式·rabbitmq·安装rabbitmq
搬砖的小码农_Sky16 小时前
Windows操作系统上`ping`命令的用法详解
运维·网络·windows
Kiri霧1 天前
Rust模式匹配详解
开发语言·windows·rust
程序设计实验室1 天前
使用命令行删除 Windows 网络映射驱动器
windows
用户31187945592181 天前
Windows 电脑安装 XTerminal 1.25.1 x64 版(带安装包下载关键词)
windows
Logintern091 天前
windows如何设置mongodb的副本集
数据库·windows·mongodb
Chandler241 天前
一图掌握 操作系统 核心要点
linux·windows·后端·系统
ajassi20001 天前
开源 C# 快速开发(十七)进程--消息队列MSMQ
windows·开源·c#
Python私教1 天前
5分钟上手 MongoDB:从零安装到第一条数据插入(Windows / macOS / Linux 全平台图解)
windows·mongodb·macos