### 实现 EasyPoi 的 Excel 导出功能
EasyPoi 是一个简化 Apache POI 操作的工具库,主要用于简化 Excel 和 Word 的导入导出操作。通过注解和模板的方式,可以快速实现 Excel 文件的导出,即使是刚接触 POI 的开发者也可以轻松上手。
#### 1. 添加依赖
在 `pom.xml` 中添加 EasyPoi 的相关依赖,推荐使用 `easypoi-spring-boot-starter`,它集成了常用的功能,简化了 Spring Boot 项目的集成过程。
```xml
<dependencies>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
```
如果需要更细粒度的控制,可以选择拆分依赖,例如引入 `easypoi-base`、`easypoi-web` 和 `easypoi-annotation`,以满足不同场景的需求。
#### 2. 定义实体类并使用注解
通过 `@Excel` 注解来定义 Excel 表格中的列名、排序、格式等信息。例如,定义一个用户实体类:
```java
import cn.afterturn.easypoi.excel.annotation.Excel;
public class User {
@Excel(name = "姓名", orderNum = "0")
private String name;
@Excel(name = "年龄", orderNum = "1")
private int age;
@Excel(name = "出生日期", format = "yyyy-MM-dd", orderNum = "2")
private Date birth;
// Getter 和 Setter
}
```
#### 3. 编写导出逻辑
EasyPoi 提供了多种导出方式,包括 **无模板导出** 和 **模板导出**。
##### 无模板导出
适用于简单数据导出,无需使用模板文件。直接通过 `ExcelExportUtil` 导出数据:
```java
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public void exportUsers(HttpServletResponse response, List<User> dataList) {
Workbook workbook = ExcelExportUtil.exportExcel(dataList, User.class);
try {
String fileName = "用户列表";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
```
##### 模板导出
适用于需要固定格式或复杂布局的 Excel 文件,例如导出带有标题、固定列宽、样式等的文件。需要准备一个 Excel 模板文件,并通过 `TemplateExportParams` 加载模板:
```java
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.File;
import java.util.Map;
public Workbook exportWithTemplate(String templatePath, Map<String, Object> dataMap) {
TemplateExportParams params = new TemplateExportParams(templatePath, true);
return ExcelExportUtil.exportExcel(params, dataMap);
}
```
在模板文件中,可以使用 `{{key}}` 作为占位符,EasyPoi 会自动替换为 `dataMap` 中的值。
#### 4. 下载 Excel 文件
在 Web 应用中,导出完成后需要将生成的 `Workbook` 写入 `HttpServletResponse`,以便浏览器下载文件:
```java
public void downloadExcel(HttpServletResponse response, String fileName, Workbook workbook) {
try {
fileName = java.net.URLEncoder.encode(fileName + ".xlsx", "UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
```
#### 5. 示例代码整合
以下是一个完整的示例,展示如何在 Spring Boot 中实现 Excel 导出功能:
```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class ExcelExportController {
@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
List<User> dataList = new ArrayList<>();
dataList.add(new User("张三", 25, "1998-05-12"));
dataList.add(new User("李四", 30, "1993-08-22"));
String templatePath = "templates/export_template.xlsx"; // 模板路径
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("list", dataList);
TemplateExportParams params = new TemplateExportParams(templatePath, true);
Workbook workbook = ExcelExportUtil.exportExcel(params, dataMap);
String fileName = "用户数据";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
workbook.write(response.getOutputStream());
}
}
```
###