EasyExcel导出万用模板

原创 springboot葵花宝典 springboot葵花宝典 2024-01-25 12:03 发表于广东

EasyExcel导出万用模板

在实际的应用中,我们经常需要将数据导出到Excel文件中。EasyExcel 是一个基于 Java 的简单、方便、快速的 Excel 处理工具,它可以帮助我们轻松实现 Excel 的导入导出功能。本文将介绍如何使用 EasyExcel,实现导出多个子页签的数据,并支持合并功能

今日内容介绍,大约花费11分钟

图片

##项目地址
https://github.com/bangbangzhou/springboot-learn/tree/main/spring-boot-export-excel

1.项目准备

完整项目结果如下:

图片

1.1. 添加相关依赖

首先,确保你的项目中已经引入了 EasyExcel 库。可以通过 Maven在项目中添加以下依赖:

springboot葵花宝典

主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目

247篇原创内容

公众号

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

<!--        easyexcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.3.3</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

        <dependency>
            <groupId>com.xiaoleilu</groupId>
            <artifactId>hutool</artifactId>
            <version>2.16.2</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.32</version>
        </dependency>
    </dependencies>

2. 编写 ExcelExportUtil 类

编写一个通用的导出文件类ExcelExportUtil类,**ExcelExportUtil 类是一个通用的 Excel 导出工具类,支持导出多个子页签,并且可以进行合并操作。以下是两个主要方法:

  • exportMultipleSheetData: 导出多个子页签的数据。

  • exportMergeMultipleSheetData: 导出并合并多个子页签的数据。

@Slf4j
@Component
public class ExcelExportUtil<T, E> {

    /**
     * 多个子页签导出功能
     *
     * @param response  响应流
     * @param fileName  导出的文件名
     * @param data      导出的数据
     * @param classArgs 导出的页签EXCEL类
     * @throws Exception
     */
    public void exportMultipleSheetData(HttpServletResponse response, String fileName, Map<Class, List<? extends Object>> data, Class<E>... classArgs) throws IOException {
        this.exportMergeMultipleSheetData(response, fileName, null, 0, data, classArgs);
    }

    /**
     * 多个子页签导出并且合并功能
     *
     * @param response         响应流
     * @param fileName         导出的文件名
     * @param mergeColumnIndex 需要合并的列
     * @param mergeRowIndex    设置第几行开始合并
     * @param data             导出的数据
     * @param classArgs        导出的页签EXCEL类
     * @throws Exception
     */
    public void exportMergeMultipleSheetData(HttpServletResponse response, String fileName, int[] mergeColumnIndex, int mergeRowIndex,
                                             Map<Class, List<? extends Object>> data, Class<E>... classArgs) throws IOException {
        try {
            fileName = new String(fileName.getBytes(), "UTF-8");
            log.info("导出的文件名为:" + fileName);
            response.addHeader("Content-Disposition", "filename=" + fileName);
            //设置类型,扩展名为.xls
            response.setContentType("application/vnd.ms-excel");
            //将数据写入sheet页中
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            // 遍历每个页签实体
            for (int i = 0; i < classArgs.length; i++) {
                // 判断数据中是否存在实体类,如果存在则做导出
                if (data.containsKey(classArgs[i])) {
                    String name = classArgs[i].getName().replace(classArgs[i].getPackageName()+".","");
                    WriteSheet writeSheet = EasyExcel.writerSheet(i, name).head(classArgs[i]).build();
                    excelWriter.write(data.get(classArgs[i]), writeSheet);
                }
            }
            excelWriter.finish();
            log.info("导出文件《" + fileName + "》成功");
            response.flushBuffer();
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<String, String>();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }
}

3. 使用 EasyExcel 导出多个子页签数据

创建一个TutorialController,演示如何使用 ExcelExportUtil 类导出多个子页签的数据:

将导出的数据,按照子页签的类别放入一个 Map 中。然后使用 exportMultipleSheetData 方法进行导出。

@RestController
@RequestMapping("/tutorial")
public class TutorialController {

    @Autowired
    private TutorialService tutorialService;

    @Autowired
    private RoleService roleService;


    @Autowired
    private ExcelExportUtil excelExportUtil;

    @PostMapping("/export")
    public void packageItemsExportNew( HttpServletResponse response) throws IOException {
        // 导出文件名
        String fileName = "test";
        List<Tutorial> list = tutorialService.list();
        List<Role> list1 = roleService.list();
        // 填充数据到每个子页签
        Map<Class, List<? extends Object>> dataMap = new HashMap<>();
        dataMap.put(Tutorial.class, list);
        dataMap.put(Role.class, list1);
        // 导出多个子页签的数据,不进行合并
        excelExportUtil.exportMultipleSheetData(response, fileName, dataMap, Tutorial.class,Role.class);
    }
}

4. 测试

使用Postman发送POST请求到http://localhost:8899/tutorial/export

图片

注意:点击send and download进行下载

结果如下:每一个类名对应一个Sheet

图片

总结:通过 EasyExcel我们可以轻松实现多个子页签数据的导出,为我们在项目中处理复杂的 Excel 导出需求提供了一种简单而有效的解决方案

##项目地址
https://github.com/bangbangzhou/springboot-learn/tree/main/spring-boot-export-excel

如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!

springboot葵花宝典

主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目

247篇原创内容

公众号

原创不易,转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值