SpringBoot 实战:手把手教你实现 Excel 文件下载!

SpringBoot 实战:手把手教你实现 Excel 文件下载!

在开发中,我们经常会遇到需要将数据导出为 Excel 文件的需求。无论是报表生成、数据备份,还是数据交换,Excel 都是一个非常常见的格式。对于 Java 开发者来说,Apache POI 是一个非常强大的库,可以帮助我们处理 Excel 文件。然而,直接使用 POI 的 API 可能会显得繁琐且容易出错。

幸运的是,SpringBoot 提供了一个非常便捷的方式,只需一个注解,就能轻松实现任意对象的下载功能。本文将详细介绍如何使用 SpringBoot 和 Apache POI 来实现这一功能,并通过一个简单的示例来演示如何将数据导出为 Excel 文件。

1. 引入依赖

首先,我们需要在 pom.xml 文件中引入相关的依赖。除了 SpringBoot 的基本依赖外,我们还需要引入 Apache POI 的依赖。

<dependencies>
	<!--	SpringBoot Web -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<!--	Apache POI -->
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>5.2.3</version>
	</dependency>
	<!--	Lombok -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
</dependencies>

2. 创建实体类

假设我们有一个 User 实体类,包含用户的姓名、年龄和邮箱信息。

import lombok.Data;
@Datapublic class User {
	private String name;
	private int age;
	private String email;
}

3. 创建 Excel 导出工具类

接下来,我们创建一个工具类 ExcelUtil,用于将对象列表导出为 Excel 文件。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;

public class ExcelUtil {
    
    public static <T> byte[] exportToExcel(List<T> dataList, Class<T> clazz) throws IOException, IllegalAccessException {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");

        // 创建表头
        Row headerRow = sheet.createRow(0);
        Field[] fields = clazz.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(fields[i].getName());
        }

        // 填充数据
        for (int i = 0; i < dataList.size(); i++) {
            Row row = sheet.createRow(i + 1);
            T data = dataList.get(i);
            for (int j = 0; j < fields.length; j++) {
                fields[j].setAccessible(true);
                Cell cell = row.createCell(j);
                cell.setCellValue(fields[j].get(data).toString());
            }
        }

        // 写入到字节数组
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);
        workbook.close();

        return outputStream.toByteArray();
    }
}

4. 创建 Controller

现在,我们创建一个 SpringBoot Controller,用于处理 Excel 导出的请求。

import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/export")
    public ResponseEntity<byte[]> exportUsers() throws IOException, IllegalAccessException {
        // 创建示例用户数据
        List<User> users = Arrays.asList(
                new User("Alice", 25, "alice@qq.com"),
                new User("Bob", 30, "bob@qq.com"),
                new User("Charlie", 35, "charlie@qq.com")
        );

        // 导出Excel
        byte[] excelBytes = ExcelUtil.exportToExcel(users, User.class);

        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", "users.xlsx");

        // 返回响应
        return ResponseEntity.ok()
                .headers(headers)
                .body(excelBytes);
    }
}

5. 运行并测试

启动 SpringBoot 应用后,访问 http://localhost:8080/api/export,浏览器会自动下载一个名为 users.xlsx 的 Excel 文件。打开该文件,你会看到如下内容:

name
age
email
Alice
25
alice@qq.com
Bob
30
bob@qq.com
Charlie
35
charlie@qq.com

6. 总结

通过以上步骤,我们实现了一个简单的 SpringBoot 应用,能够将任意对象列表导出为 Excel 文件。借助 Apache POI 和 SpringBoot 的强大功能,我们只需几行代码就能完成这一任务。这种方式不仅简化了开发流程,还提高了代码的可维护性。

如果你有更复杂的需求,比如自定义表头、样式设置等,可以进一步扩展 ExcelUtil 工具类。希望本文对你有所帮助,欢迎在评论区分享你的想法和经验!

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容