[苍穹外卖]-12Apache POI入门与实战

embedded/2024/9/19 22:48:13/ 标签: spring boot, java, mybatis

工作台

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

  1. 营业额: 已完成订单的总金额
  2. 有效订单: 已经完成订单的数量
  3. 订单完成率: 有效订单数/总订单数*100%
  4. 平均客单价: 营业额/有效订单数
  5. 新增用户: 新增的用户数量

接口设计: 一个接口返回所有数据, 会导致后端代码耦合严重, 所以还是按照模块, 划分接口

  1. 今日数据接口

  1. 订单管理接口

  1. 菜品总览接口

  1. 套餐总览接口

代码导入: 按需复制, 不要覆盖之前的代码

功能测试

Apache POI

Apache POI是一个处理Office各种文件格式的开源项目, 我们可以使用POI在java程序中对Office的各种文件进行读写操作, 一般情况下, POI都是用于读写Excel文件

快速入门: 引入坐标, 编写测试方法, 写入和读取Excel文件

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>${poi}</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi}</version>
</dependency
/*** 使用POI操作Excel文件*/
public class ApachePoiTest {/*** 通过POI创建Excel文件并且写入文件内容* POI代码的可读性很高, 跟手动操作Excel的步骤相似*/public static void write() throws Exception {//在内存中创建一个Excel对象XSSFWorkbook excel = new XSSFWorkbook();//在Excel文件中创建一个Sheet页XSSFSheet sheet = excel.createSheet("info");//在Sheeet页中创建行对象, rownum编号从0开始XSSFRow row = sheet.createRow(1);//创建单元格并且写入文件内容row.createCell(1).setCellValue("姓名");row.createCell(2).setCellValue("城市");//创建一个新行row = sheet.createRow(2);//在新行中创建单元格row.createCell(1).setCellValue("张三");row.createCell(2).setCellValue("北京");//创建一个新行row = sheet.createRow(3);//在新行中创建单元格row.createCell(1).setCellValue("李四");row.createCell(2).setCellValue("南京");//通过输出流将内存中的Excel文件写入到磁盘FileOutputStream out = new FileOutputStream(new File("C:\\Users\\Lenovo\\Desktop\\test.xlsx"));excel.write(out);//关闭资源out.close();excel.close();}public static void main(String[] args) throws Exception {write();}}

/*** 使用POI操作Excel文件*/
public class ApachePoiTest {/** 通过 POI 读取Excel文件中的内容** @throws Exception*/public static void read() throws Exception {//通过输入流获取文件对象InputStream in = new FileInputStream(new File("C:\\Users\\Lenovo\\Desktop\\test.xlsx"));//创建Excel对象,  通过Excel对象读取文件XSSFWorkbook excel = new XSSFWorkbook(in);//读取Excel文件中的第一个Sheet页(索引从0开始)XSSFSheet sheet = excel.getSheetAt(0);//获取Sheet页最后一行的行号(最后的有文字的行的行号)int lastRowNum = sheet.getLastRowNum();//遍历每一行,读取每个单元格的数据(第一行没数据, 所以从第二行开始读)for (int i = 1; i < lastRowNum; i++) {//获取某一行XSSFRow row = sheet.getRow(i);//获取单元格对象String cellValue1 = row.getCell(1).getStringCellValue();String cellValue2 = row.getCell(2).getStringCellValue();//拼接读取到的单元格内容System.out.println(cellValue1 + ":" + cellValue2);}//关闭资源in.close();excel.close();}public static void main(String[] args) throws Exception {read();}}

导出运营报表

需求分析: 导出Excel形式的报表文件, 导出最近30天的运营数据

接口设计: 该接口无需返回数据, 报表导出功能本质是文件下载, 服务端通过输出流将Excel文件下载到客户端浏览器即可

设计Excel模版文件, 以简化代码, 降低编码难度, 模版文件放在resources/template/运行数据报表模版.xlsx

controller

/*** 数据统计相关接口*/
@RestController
@RequestMapping("/admin/report")
@Api(tags = "数据统计相关接口")
@Slf4j
public class ReportController {/*** 导出运营数据报表* @param response*/@GetMapping("/export")@ApiOperation("导出运营数据报表")public void export(HttpServletResponse response) {// 通过 HttpServletRequest对象 获取输出流对象reportService.exportBusinessData(response);}}

service

public interface ReportService {/*** 导出运营数据报表* @param response*/void exportBusinessData(HttpServletResponse response);}
@Service
@Slf4j
public class ReportServiceImpl implements ReportService {/*** 导出运营数据报表** @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));// 获取文件的输出流对象InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");//2, 通过POI将数据写入到Excel文件中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);//4,关闭资源out.close();excel.close();} catch (Exception e) {e.printStackTrace();}}
}

功能测试


http://www.ppmy.cn/embedded/113038.html

相关文章

计算机毕业设计 二手闲置交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

fiddler抓包02_安装

① 访问官网&#xff1a;https://www.telerik.com/fiddler ② 点击“try for free”&#xff0c;选择经典版。 ③ 选择任意用途&#xff0c;输入邮箱&#xff0c;选择地区china&#xff0c;确定下载。 ④ 双击安装包进行安装。 安装后为英文界面&#xff1a;

nginx 文件尺寸过大解决方案

http { # 其他配置... client_max_body_size 1M; # 这是默认值&#xff0c;也可以在 server 块中覆盖 # 其他配置... } server { listen 80; server_name shop.yanmishu.cn; # 如果有这个配置&#xff0c;则会覆盖 http 块中的设置 …

借助大模型将文档转换为视频

利用传统手段将文档内容转换为视频&#xff0c;比如根据文档内容录制一个视频&#xff0c;不仅需要投入大量的时间和精力&#xff0c;而且往往需要具备专业的视频编辑技能。使用大模型技术可以更加有效且智能化地解决上述问题。本实践方案旨在依托大语言模型&#xff08;Large …

2024网络安全人才实战能力白皮书安全测试评估篇

9月10日&#xff0c;国内首个聚焦“安全测试评估”的白皮书——《网络安全人才实战能力白皮书-安全测试评估篇》&#xff08;以下简称“白皮书”&#xff09;在国家网络安全宣传周正式发布。 作为《网络安全人才实战能力白皮书》的第三篇章&#xff0c;本次白皮书聚焦“安全测…

基于react native的锚点

基于react native的锚点 效果示例图示例代码 效果示例图 示例代码 /* eslint-disable react-native/no-inline-styles */ import React, { useEffect, useRef, useState } from react; import {Image,ImageBackground,ScrollView,StyleSheet,Text,TouchableOpacity,View, } fr…

若依nday复现

前言 声明&#xff1a;此文章仅做学习&#xff0c;未经授权严禁转载。请勿利用文章内的相关技术从事非法测试&#xff0c;如因此产生的一切不良后果与文章作者无关 本文章只做简单汇总&#xff0c;在此感谢其他师傅的文章和分享 前置准备 环境搭建 下载&#xff1a;https:/…

微服务之间远程调用实现思路

项目使用的Spring Cloud Alibaba框架&#xff0c;微服务之间远程调用使用OpenFeign&#xff0c;具体实现步骤如下&#xff1a; &#xff08;1&#xff09;在api工程定义OpenFeign接口&#xff0c;使用FeignClient注解进行定义。 &#xff08;2&#xff09;服务提供方定义Open…

【FFmpeg应用场景概述】

Question FFmpeg应用场景概述 Answer FFmpeg是一个开源的音视频处理工具&#xff0c;广泛应用于多种场景。以下是一些常见的应用场景概述&#xff1a; 视频转码&#xff1a;FFmpeg支持多种音视频格式的转换&#xff0c;可以将视频文件从一种格式转换为另一种格式&#xff0c…

Vue基础明晰

Vue基础明晰 ​ Vue长期处于会写而不去理解&#xff0c;此文简单梳理一下。 ​ 一个Vue页面基本分为两部分&#xff1a;1.搜索、按钮等为主的表单域 2.展示数据库信息的表格域 Form表单&#xff1a; 一个Form表单其下为多个form-item&#xff0c;各搜索输入框都包裹在form-i…

HarmonyOS开发之使用Picker(从相册选择图片),并且通过Swiper组件实现图片预览

一&#xff1a;效果图&#xff1a; 二&#xff1a;添加依赖 import picker from ohos.file.picker; 三&#xff1a;创建showDialog showDialog() {AlertDialog.show({message: 从相册选择,alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -12 },primaryButton: {val…

pip安装包、卸载包、更新包命令

pip安装包、卸载包、更新包命令 pip命令具体说明备注pip list列出当前环境下已安装的包pip install [安装包名]安装指定包pip install SomePackage1.0.4安装指定版本pip uninstall [卸载包名]卸载指定包pip install --upgrade [要升级的包名称]升级指定包pip install -U [要升…

C++笔记---继承(下)

1. 无法被继承的类 要实现无法被继承的类有两种方式&#xff1a; C98及其之前&#xff1a;将父类的构造函数设置为private成员。 C11及其之后&#xff1a;使用final关键字修饰父类。 将构造函数设置为private是因为&#xff1a;子类的构成必须调用父类的构造函数&#xff0c;但…

C++学习笔记(26)

七 、显示字符串中的字符 从界面上输入一个字符串&#xff08;C 风格&#xff09;&#xff0c;把字符串中的每个字符显示出来&#xff0c;如果输入的是"abc"&#xff0c;要求&#xff1a; 1&#xff09;正序显示&#xff1a;a b c 2&#xff09;逆序显示&#xff1a;…

NC 矩阵最长递增路径

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个 n 行…

【SQL】百题计划:SQL最基本的判断和查询。

[SQL]百题计划 Select product_id from Products where low_fats "Y" and recyclable "Y";

车辆重识别(关于卷积神经网络一些资料)2024/9/11

关于卷积神经网络的介绍 一&#xff0c;全连接神经网络 1&#xff0c;全连接神经网络的整体结构 X代表左边输入的数据&#xff08;向量或者矩阵等等&#xff09;&#xff0c;Y代表模型对数据处理之后的结果&#xff0c;中间的节点都可以算作为隐藏层。 2&#xff0c;全连接神经…

【Linux】进程调度与切换

【Linux】进程调度与切换 1. 基本概念2. 进程切换3. 进程调度3.1运行队列实现优先级设计3.2 处理效率问题3.3 活动队列与过期队列3.4 如何解决饥饿问题3.5 active指针和expired指针 1. 基本概念 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&am…

【乐吾乐大屏可视化组态编辑器】API接口文档(pgsql)

API接口文档&#xff08;pgsql&#xff09; 在线使用&#xff1a;https://v.le5le.com/ 采用前后端分离架构&#xff0c;乐吾乐后端服务提供一整套完整的web组态编辑器的所有数据接口&#xff0c;包含2D/3D图纸接口服务、文件接口服务和用户接口服务等&#xff0c;安装包版本…

通信工程学习:什么是GPON吉比特无源光网络

GPON&#xff1a;吉比特无源光网络 GPON&#xff08;Gigabit-Capable Passive Optical Network&#xff0c;吉比特无源光网络&#xff09;是一种基于ITU-T G.984.x标准的最新一代宽带无源光综合接入技术。该技术以其高带宽、高效率、大覆盖范围和用户接口丰富等特点&#xff0c…