如何利用POI导出报表

一、报表格式

二、依赖坐标

复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

三、 controller层代码

复制代码
/*
* 导出运营表
* */
 @GetMapping("/export")
 @ApiOperation("导出运营数据报表")
 public void export(HttpServletResponse response) throws Exception {
     reportService.exportBusinessData(response);
 }

四、导出报表

复制代码
@Override
public void exportBusinessData(HttpServletResponse response) {
    //查询30天的数据
    LocalDateTime endTime = LocalDateTime.now();
    LocalDateTime startTime = endTime.minusDays(30).toLocalDate().atStartOfDay();
    BusinessDataVO businessDataVO = workspaceService.businessData(startTime, endTime);
    log.info("businessDataVO,{}", businessDataVO.toString());
    //查询每一天的
    List<BusinessDataVO> list = new ArrayList<>();
    while (startTime.isBefore(endTime)) {
        LocalDateTime end = startTime.plusHours(24).minusSeconds(1);
        BusinessDataVO dayVO = workspaceService.businessData(startTime, end);
        list.add(dayVO);
        log.info("startTime{},dayVO{}", startTime, dayVO);
        startTime = startTime.plusDays(1);
    }
    try {
        //读取excel模板
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/运营数据报表模板.xlsx");
        XSSFWorkbook workbook = new XSSFWorkbook(in);
        //填充模板
        XSSFSheet sheet = workbook.getSheetAt(0);
        //填充总的30天的
        XSSFRow row3 = sheet.getRow(3);
        XSSFRow row4 = sheet.getRow(4);
        row3.getCell(2).setCellValue(businessDataVO.getTurnover() + "");
        row3.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate() + "");
        row3.getCell(6).setCellValue(businessDataVO.getNewUsers() + "");
        row4.getCell(2).setCellValue(businessDataVO.getValidOrderCount() + "");
        row4.getCell(4).setCellValue(businessDataVO.getUnitPrice() + "");
        //填充每一天的
        int i = 0;
        startTime = endTime.minusDays(30).toLocalDate().atStartOfDay();
        for (BusinessDataVO dayVO : list) {
            XSSFRow row = sheet.getRow(7 + i);
            if (row == null) {
                row = sheet.createRow(7 + i);
            }
            row.getCell(1).setCellValue(startTime.toLocalDate().toString());
            row.getCell(2).setCellValue(dayVO.getTurnover() + "");
            row.getCell(3).setCellValue(dayVO.getValidOrderCount() + "");
            row.getCell(4).setCellValue(dayVO.getOrderCompletionRate() + "");
            row.getCell(5).setCellValue(dayVO.getUnitPrice() + "");
            row.getCell(6).setCellValue(dayVO.getNewUsers() + "");
            i++;
            startTime = startTime.plusDays(1);
        }
        //写入到response的输出流
        ServletOutputStream outputStream = response.getOutputStream();
        workbook.write(outputStream);
        //关流
        outputStream.close();
        workbook.close();
    } catch (Exception e) {
        log.error(e.getMessage(), e);
        throw new BaseException("文件下载异常");
    }
}
相关推荐
都叫我大帅哥2 小时前
Java JJWT 完全指南:从入门到生产级实践
java
前端开发张小七3 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
ThsPool4 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
赤壁小虾4 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
青山木5 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Jul1en_5 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 管理 Spring Boot 应用 阅读笔记
java·spring boot·笔记
XWalnut6 小时前
SpringBoot快速入门
java·spring boot·后端
前端 贾公子6 小时前
第06章:结构化输出 (上)
java·服务器·前端
念何架构之路6 小时前
restartmanager-重启管理子系统
java·开发语言