苍穹外卖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();
    }
}

相关推荐
陈大爷(有低保)9 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
kinlon.liu23 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓44 分钟前
Linux通过yum安装Docker
java·linux·docker
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
Reese_Cool1 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言