如何利用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("文件下载异常");
    }
}
相关推荐
WaaTong14 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_7430484414 分钟前
初识Java EE和Spring Boot
java·java-ee
AskHarries16 分钟前
Java字节码增强库ByteBuddy
java·后端
小灰灰__36 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭40 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
duration~2 小时前
Maven随笔
java·maven
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql