返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - 使用HSSFWorkbook操作excel教程1(将数据导出成excel文件)

作者:hangge | 2020-03-05 08:10
    在许多项目中,将数据库资料导出为 Excel 是一个很常见的需求,具体实现简单来说就是后端提供导出接口,前端下载导出数据即可。Jakarta POI 是一套用于访问微软格式文档的 Java API,它由很多组件组成,其中有用于操作 Excel 格式文件的 HSSF 和用于操作 Word HWPF,本文使用前者实现 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)

回到顶部