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



    前言

    工作台用于展示各项运营数据,在图形报表中很多方法都已实现,这部分的业务逻辑也差不多,只是返回的数据类型不一样。
    POI用于操作 Excel 文件,可以对Excel文件进行读写操作
    导出运营数据报表首先就是查询近30天的运营数据,然后通过POI将查询到的运营数据写入模板文件
    最后通过输出流将Excel文件下载到客户端浏览器。


    一、工作台

    工作台是系统运营的数据看板,并提供快捷操作入口,可以有效提高商家的工作效率。
    展示的数据包括:今日数据、订单管理、菜品总览、套餐总览、订单信息(已完成)
    这里只展示今日数据的代码,其他部分逻辑差不多,前面的业务逻辑中也已
    对相关sql语句编写过了,整体的业务逻辑都是根据需要返回的数据去计算对应的值,然后封装到VO实体类中返回给前端。

    1.1 今日数据

    1.1.1 接口设计

    在这里插入图片描述

    1.1.2 代码实现

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

    @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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    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方法

    @GetMapping("/export")
    @ApiOperation("到处运营数据报表")
    public void export(HttpServletResponse response){
        reportService.exportBusinessData(response);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

  • 相关阅读:
    pytorch回炉再造笔记--python类中getitem的用法
    浮躁中寻觅一分宁静
    展望未来:在【PyCharm】中结合【机器学习】实现高效的图形化处理
    爬虫工作流程、请求与响应原理、requests库讲解
    Scala的函数至简原则
    【RTOS训练营】任务调度(续)、任务礼让、调度总结、队列和晚课提问
    深聊测开领域之:一文搞懂什么是敏捷测试,如何做敏捷测试,建议先收藏再学习。
    Android的六大布局详解
    AI赋能药物研发的偶然与必然
    IAR编译报错[a148]:intrinsic function “nounwind air builtin dsb“is not
  • 原文地址:https://blog.csdn.net/qq_51076441/article/details/138132330