当前位置: 首页 > article >正文

《苍穹外卖》项目学习记录-Day12导出运营数据

·准备一个运营数据报表模板

·导入运营数据报表模板

最终我们这个表格需要下载到客户端浏览器,下载到客户端浏览器需要有一个输出流,这个输出流我们一般通过response对象获得。我们使用这个输出流就可以把我们这个Excel文件,下载到客户端浏览器。

1.查询数据库,获取营业数据---查询最近30天的运营数据

2.通过POI将数据写入到Excel文件中

this.getClass()获得类对象

this.getClass().getClassLoader()获得类加载器

this.getClass().getClassLoader().getResourceAsStream()从我们这个类路径下面读取资源,最终也可以返回一个输入流对象

3.通过输出流将Excel文件下载到客户端浏览器

 /**
     * 根据时间段统计营业数据
     * @param begin
     * @param end
     * @return
     */
    public BusinessDataVO getBusinessData(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();
    }
/**
     * 导出运营数据报表
     * @param response
     */
    public void exportBusinessData(HttpServletResponse response) {
       //1.查询数据库,获取营业数据---查询最近30天的运营数据
        LocalDate dateBegin = LocalDate.now().minusDays(30);
        LocalDate dateEnd = LocalDate.now().minusDays(1);

        //查询概览数据
        BusinessDataVO businessDataVO = workspaceService.getBusinessData(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.getBusinessData(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);

            //关闭资源
            out.close();
            excel.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

 ·功能测试


http://www.kler.cn/a/532040.html

相关文章:

  • 手写MVVM框架-实现简单的数据代理
  • Qt网络相关
  • 【LeetCode 刷题】回溯算法(4)-排列问题
  • 【线程】基于环形队列的生产者消费者模型
  • STM32 对射式红外传感器配置
  • csapp笔记3.6节——控制(1)
  • 文字的力量
  • DeepSeek如何微调成智能制造专用大模型?
  • 在Vue 3中使 echarts 图表宽度自适应变化
  • 什么叫DeepSeek-V3,以及与GPT-4o的区别
  • 实战:如何利用网站外部链接提升收录?
  • UE求职Demo开发日志#21 背包-仓库-装备栏移动物品
  • 【ComfyUI专栏】在ComfyUI中编辑节点框的样式与背景
  • 【大模型】AI 辅助编程操作实战使用详解
  • [250204] Mistral Small 3:小巧、快速、强大 | asdf 0.16.0 发布:Golang 重写带来性能飞跃
  • 机器学习,深度学习,神经网络,深度神经网络
  • DeepSeek:全栈开发者视角下的AI革命者
  • FinRobot:一个使用大型语言模型的金融应用开源AI代理平台
  • LabVIEW的智能电源远程监控系统开发
  • 为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?
  • 接口测试用例设计-笔记
  • 本地Ollama部署DeepSeek R1模型接入Word
  • kaggle视频行为分析1st and Future - Player Contact Detection
  • 《海丰县蔡氏简介》前言
  • Kafka的安装及相关操作命令
  • 动态分库分表