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、导出结果

相关推荐
一禅(OneZen)1 小时前
「Windows/Mac OS」AIGC图片生成视频 ,webui + stable-diffusion环境部署教程
windows·stable diffusion
AirDroid_cn1 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
小龙在山东3 小时前
Python 包管理工具 uv
windows·python·uv
昏睡红猹4 小时前
我在厂里搞wine的日子
windows·wine
love530love7 小时前
Docker 稳定运行与存储优化全攻略(含可视化指南)
运维·人工智能·windows·docker·容器
1024小神12 小时前
tauri项目在windows上的c盘没有权限写入文件
c语言·开发语言·windows
程序视点20 小时前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
wuk99820 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
lzb_kkk21 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
Paper_Love1 天前
x86-64_windows交叉编译arm_linux程序
arm开发·windows