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

news2025/3/13 17:19:48

文章目录

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


前言

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

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();
}

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);
}

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();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1618009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字逻辑电路基础-有限状态机

文章目录 一、有限状态机基本结构二、verilog写一个基础有限状态机(moore型状态机)三、完整代码一、有限状态机基本结构 本文主要介绍使用verilog编写有限状态机FSM(finite state machine),它主要由三部分组成,下一状态逻辑电路,当前状态时序逻辑电路和输出逻辑电路。 有…

越秀北京 梧桐星宸 l理想人生要满配,这届海淀菁英买房主打“一步到位”

一个理想生活住区&#xff0c;装得下万般繁华与生活想象&#xff1b;一个懂包容的户型&#xff0c;能兼容全家所需并赋能成长。这届眼界超前的海淀菁英&#xff0c;买房需求已经从“阶段进阶”变成“一步到位”&#xff0c;对生活资源与生活空间的至高追求&#xff0c;让他们将…

[Flutter3] Json转dart模型举例

记录一下 Android studio plugin -> FlutterJsonBeanFactory 处理json转dart 模型 案例 json字符串, 一个 response的data返回数据 {"code":1,"msg":"\u64cd\u4f5c\u6210\u529f","data":{"list":{"id":"8…

做抖音小店正确起店的方式,新店铺想快速爆单,步骤就这几个

大家好&#xff0c;我是电商笨笨熊 开通了抖音小店&#xff0c;但是店铺一直没有流量&#xff1b; 很多新手玩家进入抖店后都会遇到这样那样的问题&#xff0c;烦恼的事情一大堆&#xff1b; 没关系&#xff0c;今天我们就来聊聊新店铺该怎么快速起店&#xff0c;新手如何做…

Springboot+Vue项目-基于Java+MySQL的学科竞赛管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

MLLM | Mini-Gemini: 挖掘多模态视觉语言大模型的潜力

香港中文、SmartMore 论文标题&#xff1a;Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models Code and models are available at https://github.com/dvlab-research/MiniGemini 一、问题提出 通过更高分辨率的图像增加视觉标记的数量可以丰富…

ScanNet 数据集常见文件的作用极其读取方式

ScanNet 数据集是一个大规模的 RGB-D 视频数据集&#xff0c;它包含了丰富的三维场景理解任务所需的数据&#xff0c;如三维物体分类、语义体素标签和 CAD 模型检索等。数据集中的每个文件都有特定的作用&#xff0c;以下是一些常见文件及其作用的解释&#xff1a; _vh_clean.p…

【八股文】Spring 谈谈你对AOP的理解

AOP AOP(Aspect-Oriented Programming&#xff0c;面向切面编程)&#xff1a;是一种新的方法论&#xff0c;是对传统 OOP(Object-Oriented Programming&#xff0c;面向对象编程)的补充。 面向对象是纵向继承&#xff0c;面向切面是横向抽取。 OOP思想是一种垂直纵向的继承体…

C# DataSet结合FlyTreeView显示树状模型数据

目录 关于 FlyTreeView DataSet 数据准备 涉及表结构创建脚本 范例运行环境 方法设计 代码实现 方法代码 调用示例 小结 关于 FlyTreeView NineRays.WebControls.FlyTreeView 是 9rays.net 推出的一款功能强大的树状模型数据显示控件&#xff0c;本文将介绍使用其 As…

运营高手都在用的9款办公软件!一定要收藏

最近&#xff0c;运营群里的00后天天都在搞新花样&#xff0c;每天都有新的idea&#xff0c;各种跟热点、做品牌联名、拍好玩的视频、做创意海报……。但奇怪的是&#xff0c;工作量增加了、业绩增长了&#xff0c;却不见有人加班。一问&#xff0c;原来因为用上了办公神器啊&a…

通过使用XShell工具、Nginx环境实现服务器项目构建与发布

前言&#xff1a; 在信息化和数字化的今天&#xff0c;网站和应用的构建与发布已成为企业发展的重要一环。为了确保项目的顺利上线和稳定运行&#xff0c;选择合适的工具和环境至关重要。本文将详细介绍如何通过XShell工具以及Nginx环境来实现服务器项目的构建与发布&#xff0…

数据洞察创新挑战赛之智能运维赛参赛攻略--皮卡丘的皮卡

关联比赛: 数据洞察创新挑战赛之智能运维赛 背景和参赛动机 1.个人背景和专业领域 四川大学本科&#xff0c;中南大学研究生&#xff0c;专业是医学图像处理。目前就职于深信服&#xff0c;主要做云安全相关的业务开发工作。 2.何时开始关注和参与数据科学竞赛&#xff1f…

IDEA插件-通义灵码 VS ChatGPT-EasyCode

智能编码助手新时代&#xff1a;通义灵码 vs ChatGPT-EasyCode 随着人工智能技术的飞速发展&#xff0c;智能编码助手逐渐成为程序员的必备工具。它们可以帮助程序员提高编码效率&#xff0c;降低代码缺陷率&#xff0c;并解放创造力。 目前市场上涌现出了众多智能编码助手&a…

如何在Windows 10中打开和自定义搜索?这里提供详细步骤

使用Windows 10中的搜索功能&#xff0c;你可以快速查找计算机上的文件、应用程序或设置。在本文&#xff0c;你可以学习如何在Windows 10中打开和控制搜索。 打开Windows 10搜索面板 打开Windows 10搜索面板很容易。通常&#xff0c;你可以在任务栏上找到搜索图标。只需单击…

Redis篇:缓存击穿及解决方案

1.何为缓存击穿 缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff08;有可能是正好过期了&#xff09;&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 常见的解决方案有两种&#xff1a; 互斥锁 逻…

仓库管理存在的问题及改进对策?

大部分人都指导仓库问题会影响一个仓库操作或与之相关的整个流程链的速度、效率和生产力。但在大多数情况下&#xff0c;只有在流程开始甚至完成后才能识别这些错误。 到那时通常已经来不及阻止错误了&#xff0c;甚至可能来不及减少造成的损害。 所以这也是我写这篇内容的目…

C++-DAY1

思维导图 有以下定义&#xff0c;说明哪些量可以改变哪些不可以改变&#xff1f; const char *p; const (char *) p; char *const p; const char* const p; char const *p; (char *) const p; char const* const p; const char *p&#xff1a;指针 p 所指向的内容不可改…

mybatis 生成器,是否功能实现,需写测试类

一、看视频步骤 请按视频流程走 mybatis-18-CSDN直播 二、视频报错 解决思路 网址&#xff1a; 使用配置 | MyBatis-Plus (baomidou.com) 添加代码&#xff1a; 效果图&#xff1a;√ Tests passed: 前面✔&#xff0c;表示正确。 1为最终结果

揭开ChatGPT面纱(1):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

代码随想录训练营Day 29|Python|Leetcode|● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

860.柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确…