如何在SpringBoot中实现Excel数据导出功能?
在一些企业级的应用中,对于数据导出成Excel表格的需求是一个非常常见的需求,在SpringBoot中,我们可以借助于Apache POI库来实现这个需求,下面我们就来详细介绍一下如何在Spring Boot项目中通过Apache POI库来实现Excel的数据导出操作。
引入依赖
Apache POI是Java处理Microsoft Office文件(如Excel)的常用库。首先,需要在Spring Boot项目的pom.xml文件中添加Apache POI的依赖,如下所示。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
创建导出Excel的工具类
接下来创建一个工具类,用于将数据写入Excel文件。我们可以在这个工具类中定义例如设置Excel表格格式、设置单元格表头等操作内容,这样可以方便我们更好的去扩展这个Excel数据导出的工具类。
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
public class ExcelExportUtil {
public static ByteArrayOutputStream exportToExcel(List<String[]> data, String[] headers) {
try (Workbook workbook = new XSSFWorkbook();
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
// 创建工作表
Sheet sheet = workbook.createSheet("Data");
// 创建表头
Row headerRow = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
Cell cell = headerRow.createCell(i);
cell.setCellValue(headers[i]);
cell.setCellStyle(createHeaderCellStyle(workbook));
}
// 填充数据
for (int i = 0; i < data.size(); i++) {
Row row = sheet.createRow(i + 1);
String[] rowData = data.get(i);
for (int j = 0; j < rowData.length; j++) {
row.createCell(j).setCellValue(rowData[j]);
}
}
// 自动调整列宽
for (int i = 0; i < headers.length; i++) {
sheet.autoSizeColumn(i);
}
workbook.write(out);
return out;
} catch (IOException e) {
throw new RuntimeException("导出Excel失败", e);
}
}
private static CellStyle createHeaderCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
style.setFont(font);
return style;
}
}
创建导出服务
定义好表格工具类之后,接下来需要再业务层中定义一个业务操作类,通过这个业务操作类将数据库中的数据导出到Excel文件操作中,如下所示,这里我们模拟了数据库读取的数据,实际的操作中,我们可以通过整合ORM框架将数据库中的数据进行组合。
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
@Service
public class ExcelExportService {
public ByteArrayOutputStream generateExcel() {
// 模拟数据
String[] headers = {"ID", "Name", "Age", "Email"};
List<String[]> data = Arrays.asList(
new String[]{"1", "Alice", "23", "alice@example.com"},
new String[]{"2", "Bob", "30", "bob@example.com"},
new String[]{"3", "Charlie", "28", "charlie@example.com"}
);
return ExcelExportUtil.exportToExcel(data, headers);
}
}
创建控制器提供Excel下载接口
完成业务层开发之后,接下来就是控制层的数据获取以及下载操作,我们可以通过HTTP请求实现Excel的文件导出下载的功能如下所示。
@RestController
@RequestMapping("/api/export")
public class ExcelExportController {
@Autowired
private ExcelExportService excelExportService;
@GetMapping("/excel")
public ResponseEntity<byte[]> exportExcel() {
ByteArrayOutputStream outputStream = excelExportService.generateExcel();
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=export.xlsx")
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(outputStream.toByteArray());
}
}
总结
这样我们就可以启动应用程序来调用这个接口,就可以实现Excel文件的导出下载工作了,当然在实际的工作中,我们可以选择的方式还有很多,当然有兴趣的读者也可以基于上面的例子实现更高级的扩展,有问题可以在评论区留言,我们一起来讨论。