SpringBoot - 使用HSSFWorkbook操作excel教程1(将数据导出成excel文件)
作者:hangge | 2020-03-05 08:10
在许多项目中,将数据库资料导出为 Excel 是一个很常见的需求,具体实现简单来说就是后端提供导出接口,前端下载导出数据即可。Jakarta POI 是一套用于访问微软格式文档的 Java API,它由很多组件组成,其中有用于操作 Excel 格式文件的 HSSF 和用于操作 Word 的 HWPF,本文使用前者实现 Excel 文件的导出。
(2)前端代码比较简单,只要在用户点击“导出”按钮时,执行如下代码发起请求下载文件即可:
(3)下载下来的 Excel 里的内容如下:
一、将数据导出成 excel 文件
1,添加依赖
编辑项目的 pom.xml 文件,添加 poi 相关依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
2,创建数据模型
这里我们定义一个 User 模型对象,后面将会将其导出成 excel。
@Getter
@Setter
@AllArgsConstructor
public class User {
private int id;
private String name;
private String gender;
private Date birthday;
private String workID;
}
3,创建导出工具类
为方便使用,这里封装一个用于导出数据的工具类。里面主要工作是构建一个 HSSFWorkbook 并进行一些 Excel 基本信息配置(文档信息、列的宽度、表头配置等),然后遍历 users 集合,将数据导出到 Excel 中。public class PoiUtils {
// 将数据导出成excel文件
public static ResponseEntity<byte[]> exportUser2Excel(List<User> users) {
HttpHeaders headers = null;
ByteArrayOutputStream baos = null;
try {
//1.创建Excel文档
HSSFWorkbook workbook = new HSSFWorkbook();
//2.创建文档摘要
workbook.createInformationProperties();
//3.获取文档信息,并配置
DocumentSummaryInformation dsi = workbook.getDocumentSummaryInformation();
//3.1文档类别
dsi.setCategory("人员信息");
//3.2设置文档管理员
dsi.setManager("hangge");
//3.3设置组织机构
dsi.setCompany("航歌");
//4.获取摘要信息并配置
SummaryInformation si = workbook.getSummaryInformation();
//4.1设置文档主题
si.setSubject("人员信息表");
//4.2.设置文档标题
si.setTitle("人员信息");
//4.3 设置文档作者
si.setAuthor("hangge");
//4.4设置文档备注
si.setComments("备注信息暂无");
//创建Excel表单
HSSFSheet sheet = workbook.createSheet("2019年人员信息");
//创建日期显示格式
HSSFCellStyle dateCellStyle = workbook.createCellStyle();
dateCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
//创建标题的显示样式
HSSFCellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//定义列的宽度
sheet.setColumnWidth(0, 5 * 256);
sheet.setColumnWidth(1, 12 * 256);
sheet.setColumnWidth(2, 10 * 256);
sheet.setColumnWidth(3, 5 * 256);
sheet.setColumnWidth(4, 12 * 256);
//5.设置表头
HSSFRow headerRow = sheet.createRow(0);
HSSFCell cell0 = headerRow.createCell(0);
cell0.setCellValue("编号");
cell0.setCellStyle(headerStyle);
HSSFCell cell1 = headerRow.createCell(1);
cell1.setCellValue("姓名");
cell1.setCellStyle(headerStyle);
HSSFCell cell2 = headerRow.createCell(2);
cell2.setCellValue("工号");
cell2.setCellStyle(headerStyle);
HSSFCell cell3 = headerRow.createCell(3);
cell3.setCellValue("性别");
cell3.setCellStyle(headerStyle);
HSSFCell cell4 = headerRow.createCell(4);
cell4.setCellValue("出生日期");
cell4.setCellStyle(headerStyle);
//6.装数据
for (int i = 0; i < users.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
User user = users.get(i);
row.createCell(0).setCellValue(user.getId());
row.createCell(1).setCellValue(user.getName());
row.createCell(2).setCellValue(user.getWorkID());
row.createCell(3).setCellValue(user.getGender());
HSSFCell birthdayCell = row.createCell(4);
birthdayCell.setCellValue(user.getBirthday());
birthdayCell.setCellStyle(dateCellStyle);
}
headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment",
new String("人员信息表.xls".getBytes("UTF-8"), "iso-8859-1"));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
baos = new ByteArrayOutputStream();
workbook.write(baos);
} catch (IOException e) {
e.printStackTrace();
}
return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);
}
}
4,使用样例
(1)我们再创建一个 Controller 调用这个工具类来导出 excel 文件:
@RestController
public class HelloController {
@GetMapping("/exportUser")
public ResponseEntity<byte[]> exportUser() {
// 准备需要导出的数据
List<User> users = new ArrayList<>();
users.add(new User(1,"张三", "男", new Date(), "01001"));
users.add(new User(2,"李四", "男", new Date(), "01002"));
users.add(new User(3,"王五", "女", new Date(), "01003"));
// 将数据导出成excel
return PoiUtils.exportUser2Excel(users);
}
}
(2)前端代码比较简单,只要在用户点击“导出”按钮时,执行如下代码发起请求下载文件即可:
window.open("/exportUser", "parent");
(3)下载下来的 Excel 里的内容如下:
全部评论(0)