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)