苍穹外卖day12 (Apache POI) 数据统计-Excel报表

文章目录

  • 前言
  • 一、工作台
    • [1.1 今日数据](#1.1 今日数据)
      • [1.1.1 接口设计](#1.1.1 接口设计)
      • [1.1.2 代码实现](#1.1.2 代码实现)
    • [1.2 订单管理接口](#1.2 订单管理接口)
    • 1.3菜品总览接口
    • [1.4 套餐总览接口](#1.4 套餐总览接口)
    • [1.5 订单搜索(已完成)](#1.5 订单搜索(已完成))
    • [1.6 各个状态的订单数量统计(已完成)](#1.6 各个状态的订单数量统计(已完成))
  • [二、Apache POI](#二、Apache POI)
    • [2.1 概述](#2.1 概述)
    • [2.2 效果展示](#2.2 效果展示)
  • 三、导出运营数据Excel报表
    • [3.1 业务规则](#3.1 业务规则)
    • [3.2 接口设计](#3.2 接口设计)
    • [3.3 代码实现](#3.3 代码实现)

前言

工作台用于展示各项运营数据,在图形报表中很多方法都已实现,这部分的业务逻辑也差不多,只是返回的数据类型不一样。

POI用于操作 Excel 文件,可以对Excel文件进行读写操作

导出运营数据报表首先就是查询近30天的运营数据,然后通过POI将查询到的运营数据写入模板文件

最后通过输出流将Excel文件下载到客户端浏览器。


一、工作台

工作台是系统运营的数据看板,并提供快捷操作入口,可以有效提高商家的工作效率。

展示的数据包括:今日数据、订单管理、菜品总览、套餐总览、订单信息(已完成)

这里只展示今日数据的代码,其他部分逻辑差不多,前面的业务逻辑中也已

对相关sql语句编写过了,整体的业务逻辑都是根据需要返回的数据去计算对应的值,然后封装到VO实体类中返回给前端。

1.1 今日数据

1.1.1 接口设计

1.1.2 代码实现

1、在workspaceController中定义方法,实现工作台展示今日数据

java 复制代码
@GetMapping("/businessData")
@ApiOperation("今日数据")
public Result<BusinessDataVO> businessData(){
    //获得当天的开始时间
    LocalDateTime begin = LocalDateTime.now().with(LocalTime.MIN);
    LocalDateTime end = LocalDateTime.now().with(LocalTime.MAX);
    BusinessDataVO businessDataVO =  workspaceService.businessData(begin,end);
    return Result.success(businessDataVO);
}

2、在WorkspaceService中编写businessData方法,在WorkspaceServiceImpl中实现

java 复制代码
public BusinessDataVO businessData(LocalDateTime begin, LocalDateTime end) {
    Map map = new HashMap();
    map.put("begin",begin);
    map.put("end",end);
    //查询总订单数
    Integer totalOrderCount = orderMapper.countByMap(map);
    map.put("status", Orders.COMPLETED);
    //营业额
    Double turnover = orderMapper.sumByMap(map);
    turnover = turnover == null? 0.0 : turnover;
    //有效订单数
    Integer validOrderCount = orderMapper.countByMap(map);
    Double unitPrice = 0.0;
    Double orderCompletionRate = 0.0;
    if(totalOrderCount != 0 && validOrderCount != 0){
        //订单完成率
        orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;
        //平均客单价
        unitPrice = turnover / validOrderCount;
    }
    //新增用户数
    Integer newUsers = userMapper.countByMap(map);
    return BusinessDataVO.builder()
            .turnover(turnover)
            .validOrderCount(validOrderCount)
            .orderCompletionRate(orderCompletionRate)
            .unitPrice(unitPrice)
            .newUsers(newUsers)
            .build();
}

3、在xxxMapper中定义方法,在day11统计报表中很多方法都已实现。

1.2 订单管理接口

1.3菜品总览接口

1.4 套餐总览接口

1.5 订单搜索(已完成)

1.6 各个状态的订单数量统计(已完成)

二、Apache POI

2.1 概述

Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。

一般情况下,POI 都是用于操作 Excel 文件。

应用场景:

  • 银行网银系统导出交易明细
  • 各种业务系统导出Excel报表
  • 批量导入业务数据

2.2 效果展示

三、导出运营数据Excel报表

3.1 业务规则

导出Excel形式的报表文件

导出最近30天的运营数据

3.2 接口设计

当前接口没有返回数据,因为报表导出功能本质上是文件下载,

服务端会通过输出流将Excel文件下载到客户端浏览器

3.3 代码实现

1、设计Excel模板文件

2、在ReportController中创建export方法

java 复制代码
@GetMapping("/export")
@ApiOperation("到处运营数据报表")
public void export(HttpServletResponse response){
    reportService.exportBusinessData(response);
}

3、在ReportService接口中声明导出运营数据报表的方法,在ReportServiceImpl实现类中实现

java 复制代码
public void exportBusinessData(HttpServletResponse response) {
    //1. 查询数据库,获取营业数据--获取最近30天的运营数据
    LocalDate dateBegin = LocalDate.now().minusDays(30);
    LocalDate dateEnd = LocalDate.now().minusDays(1);
    //查询今日数据
    BusinessDataVO businessDataVO = workspaceService.businessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX));
    //2. 通过POI将数据写入到excel文件中
    InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
    try {
        //基于模板文件创建一个新的Excel文件
        XSSFWorkbook excel = new XSSFWorkbook(in);
        //获取表格文件sheet页
        XSSFSheet sheet = excel.getSheet("Sheet1");
        //填充数据--时间
        sheet.getRow(1).getCell(1).setCellValue("时间:"+dateBegin+"至"+dateEnd);
        //获得第4行
        XSSFRow row = sheet.getRow(3);
        row.getCell(2).setCellValue(businessDataVO.getTurnover());
        row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());
        row.getCell(6).setCellValue(businessDataVO.getNewUsers());
        //获得第5行
        row = sheet.getRow(4);
        row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());
        row.getCell(4).setCellValue(businessDataVO.getUnitPrice());
        //填充明细数据
        for (int i = 0; i < 30; i++) {
            LocalDate date = dateBegin.plusDays(i);
            BusinessDataVO businessData = workspaceService.businessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
            //获得某一行
            row = sheet.getRow(7 + i);
            row.getCell(1).setCellValue(date.toString());
            row.getCell(2).setCellValue(businessData.getTurnover());
            row.getCell(3).setCellValue(businessData.getValidOrderCount());
            row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
            row.getCell(5).setCellValue(businessData.getUnitPrice());
            row.getCell(6).setCellValue(businessData.getNewUsers());
        }
        //3. 通过输出流将Excel文件下载到客户端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);
        //4.关闭资源
        out.close();
        excel.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

相关推荐
Allen Bright2 分钟前
Spring Boot 整合 RabbitMQ:手动 ACK 与 QoS 配置详解
spring boot·rabbitmq·java-rabbitmq
m0_748255266 分钟前
easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层
前端·excel
新手小袁_J19 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅20 分钟前
C#关键字volatile
java·redis·c#
Monly2121 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang2323 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
goTsHgo24 分钟前
在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
spring boot·后端·mvc
小张认为的测试28 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
钱多多_qdd34 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha36 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk