返回

若依 ruoyi | 基于Spring Boot构建的Admin系统 | excel导入导出

后端

使用 EasyPoi 在 Ruoyi 中实现 Excel 导入导出(含图片处理)

一、概述

Ruoyi 是一款强大的 Admin 系统,构建于 Spring Boot 之上。本文将探讨如何利用 EasyPoi 这一强大的框架在 Ruoyi 中实现 Excel 导入导出,并深入了解如何处理图片数据。

二、环境准备

1. 依赖引入

在项目中引入以下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>6.2.3</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>6.2.3</version>
</dependency>

2. 配置文件

为正确解析日期格式,添加以下配置:

spring.mvc.date-format=yyyy-MM-dd HH:mm:ss

三、导入导出实现

1. 导入

@PostMapping("/import")
public R importData(@RequestParam("file") MultipartFile file) {
    try {
        // 导入 Excel 数据到 User 对象列表中
        List<User> users = EasyPoiUtil.importExcel(file, User.class);
        // 保存用户数据到数据库
        userService.saveBatch(users);
        return R.ok();
    } catch (Exception e) {
        log.error("导入数据失败", e);
        return R.failed(e.getMessage());
    }
}

2. 导出

@GetMapping("/export")
public void exportData(HttpServletResponse response) {
    try {
        // 获取用户数据列表
        List<User> users = userService.list();
        // 导出 Excel 文件到响应中
        EasyPoiUtil.exportExcel(users, "用户数据", "用户", User.class, "user.xls", response);
    } catch (Exception e) {
        log.error("导出数据失败", e);
    }
}

四、处理图片数据

1. 导入

1)实体类添加注解

@Excel(name = "用户", height = 20, width = 30)
public class User {

    // 使用 EasyPoi Excel 注解指定图片导入类型为图片(类型2),并指定列宽
    @Excel(name = "头像", type = 2, width = 40)
    private String avatar;
}

2)导入方法修改

@PostMapping("/import")
public R importData(@RequestParam("file") MultipartFile file) {
    try {
        // 导入 Excel 数据到 User 对象列表中
        List<User> users = EasyPoiUtil.importExcel(file, User.class);
        for (User user : users) {
            // 处理图片数据
            String avatar = user.getAvatar();
            if (avatar != null && !avatar.isEmpty()) {
                String[] strs = avatar.split(",");
                byte[] bytes = Base64.getDecoder().decode(strs[1]);
                String suffix = strs[0].substring(strs[0].indexOf("/") + 1);
                String fileName = UUID.randomUUID() + "." + suffix;
                FileUtils.writeByteArrayToFile(new File("/path/to/save/" + fileName), bytes);
                user.setAvatar("/path/to/save/" + fileName);
            }
        }
        // 保存用户数据到数据库
        userService.saveBatch(users);
        return R.ok();
    } catch (Exception e) {
        log.error("导入数据失败", e);
        return R.failed(e.getMessage());
    }
}

2. 导出

1)实体类添加注解

@Excel(name = "用户", height = 20, width = 30)
public class User {

    // 使用 EasyPoi Excel 注解指定图片导出类型为图片(类型2),并指定列宽
    @Excel(name = "头像", type = 2, width = 40)
    private String avatar;
}

2)导出方法修改

@GetMapping("/export")
public void exportData(HttpServletResponse response) {
    try {
        // 获取用户数据列表
        List<User> users = userService.list();
        for (User user : users) {
            // 处理图片数据
            String avatar = user.getAvatar();
            if (avatar != null && !avatar.isEmpty()) {
                byte[] bytes = FileUtils.readFileToByteArray(new File(avatar));
                String base64 = "data:image/png;base64," + Base64.getEncoder().encodeToString(bytes);
                user.setAvatar(base64);
            }
        }
        // 导出 Excel 文件到响应中
        EasyPoiUtil.exportExcel(users, "用户数据", "用户", User.class, "user.xls", response);
    } catch (Exception e) {
        log.error("导出数据失败", e);
    }
}

五、结语

本文深入探討了如何使用 EasyPoi 在 Ruoyi 中實現 Excel 導入導出功能,以及如何處理圖片數據。通過遵循文中步驟,開發者可以輕鬆地將此功能整合到自己的項目中。

六、常見問題解答

  1. EasyPoi 與 POI 有何區別?
    EasyPoi 是一個構建於 POI 之上的框架,它提供了一個更簡單、更友好的 Excel 操作介面。

  2. 如何指定圖片導出的寬度和高度?
    可以使用 EasyPoi 的 @Excel 注解中的 widthheight 屬性。

  3. 如何自定義圖片導出的格式?
    可以使用 EasyPoi 的 @Excel 注解中的 format 屬性。

  4. 是否可以一次導出多個工作表?
    是的,EasyPoi 支援同時導出多個工作表,可以使用 @Excel 注解中的 sheetName 屬性。

  5. 如何處理 Excel 中的公式?
    EasyPoi 不支援直接導出公式,建議在導出前將公式轉換為值。