苍穹外卖-day12
苍穹外卖-day12
课程内容
导入
导出Excel表格功能
经验储备
- 你曾经绘制图表,如柱状图、饼图、折线图
- 你曾经使用过group by 和 聚合函数写过sql
功能实现:工作台、POI、导出运营数据Excel报表
效果图:


1. 导入平台代码
导入平台代码
工作台是系统运营的数据看板,并提供快捷操作入口,可以有效提高商家的工作效率。 👍

名词解释:
- 营业额: 已完成订单的总金额
- 有效订单: 已完成订单的数量
- 订单完成率 :有效订单数 / 总订单数 * 100%
- 平均客单价 :营业额 / 有效订单数
- 新增用户: 新增用户的数量
代码实现 👇
直接导入课程资料中的工作台模块功能代码即可:

注意:
- 建议从Controller————>Mapper的顺序进行导入,先导入WorkSpace开头的代码,再导入其他代码
- 不要覆盖原有自己的代码(Dish和Setmeal相关代码 ),因此需要挑选导入
功能测试
- 测试
- 提交git
课堂作业
🎻 1.按照上面的步鄹和建议,完成导入和测试 👈

如果前置代码没有完成,别慌!!可以使用已经准备好的代码,练习当前知识
- 创建一个
非中文
的文件夹,右击git bash here
执行下述命令,将代码clone到本地
git clone --branch V1.12.0 https://gitee.com/huhu520/sky-take-out79.git
- 使用idea导入上述代码,并且检查并调整:
Setting中
:Maven设置、Complier中JDK版本,以及Project Structure
中的JDK版本 - 点击Idea中右边聚合项目的
clean指令
,观察是否执行成功,如果成功,进行下一步 - 找到sky-server的resource下的
application-dev.yml
文件,修改数据库名字、数据库用户名、数据库密码、微信appid 微信secret、redis密码
等信息 - 完成上面的步鄹后,启动SkyApplication.java类,运行项目(记得运行redis和微信小程序工具,以及Nginx哦)
如果完成上面的步鄹后,项目能正常运行,恭喜你部署checkout代码成功!🎉🎉,现在可以大展拳脚完成SpringTask案例了
2. POI入门案例 🍐 ✏️
POI入门案例
Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。
一般情况下,POI 都是用于操作 Excel 文件。



代码实现 👇
- 导入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
将数据写入Excel文件:
public class ExcelDemo {
public static void main(String[] args) throws IOException {
//在内存中创建一个Excel文件对象
XSSFWorkbook excel = new XSSFWorkbook();
// 创建Sheet页
XSSFSheet sheet = excel.createSheet("book");
//在Sheet页中创建行,0表示第1行
XSSFRow row1 = sheet.createRow(0);
//创建单元格并在单元格中设置值,单元格编号也是从0开始,1表示第2个单元格
row1.createCell(1).setCellValue("姓名");
row1.createCell(2).setCellValue("城市");
XSSFRow row2 = sheet.createRow(1);
row2.createCell(1).setCellValue("韩立");
row2.createCell(2).setCellValue("黄枫谷");
XSSFRow row3 = sheet.createRow(2);
row3.createCell(1).setCellValue("东方不败");
row3.createCell(2).setCellValue("黑木崖");
FileOutputStream out = new FileOutputStream(new File("D:\\poi_excel.xlsx"));
//通过输出流将内存中的Excel文件写入到磁盘上
excel.write(out);
//关闭资源
out.flush();
out.close();
excel.close();
}
}
- 读取Excel文件中的数据:
private static void importExcel() throws Exception {
FileInputStream in = new FileInputStream(new File("D:\\poi_excel.xlsx"));
//通过输入流读取指定的Excel文件
XSSFWorkbook excel = new XSSFWorkbook(in);
//获取Excel文件的第1个Sheet页
XSSFSheet sheet = excel.getSheetAt(0);
// 获取Sheet页中的最后一行的行号
int lastRowNum = sheet.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
// 获取Sheet页中的行
XSSFRow titleRow = sheet.getRow(i);
// 获取行的第2个单元格
XSSFCell cell1 = titleRow.getCell(1);
//获取单元格中的文本内容
String cellValue1 = cell1.getStringCellValue();
//获取行的第3个单元格
XSSFCell cell2 = titleRow.getCell(2);
//获取单元格中的文本内容
String cellValue2 = cell2.getStringCellValue();
System.out.println(cellValue1 + " " + cellValue2);
}
//关闭资源
in.close();
excel.close();
}
总结
- poi的作用是什么,有什么作用?
课堂作业
🎻 1. 按照上面的步鄹和建议,完成导入和导出
在测试类中,书写测试类 测试poi的导入和导出逻辑

3. 导出运营数据
前提:需要完成平台代码导入后,才能完成此功能!!
导出运营数据
点击导出
导出格式:

- 业务规则:
- 导出Excel形式的报表文件
- 导出最近30天 的运营数据

代码实现 👇
根据接口定义,在ReportController中创建export方法:
/**
* 导出运营数据报表
* @param response
*/
@GetMapping("/export")
@ApiOperation("导出运营数据报表")
public void export(HttpServletResponse response){
reportService.exportBusinessData(response);
}
在ReportService接口中声明导出运营数据报表的方法:
/**
* 导出运营数据报表
* @param response
*/
void exportBusinessData(HttpServletResponse response);
在ReportServiceImpl实现类中实现导出运营数据报表的方法 🍐
- 获取前20天的运营数据
/**
* 导出运营数据报表
* @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) {
e.printStackTrace();
}
}
功能测试
- 测试
- 提交git
课后作业
🚩 1. 重点完成上述的课堂作业
晚自习第一节课的前30分钟,总结完毕之后,每个同学先必须梳理今日知识点 (记得写不知道的,以及感恩三件事);整理好的笔记可以发给组长,组长交给班长,意在培养大家总结的能力)
晚自习第一节课的后30分钟开始练习(记住:程序员是代码堆起来的):
- 先要把今天的所有案例或者课堂练习,如果没练完的,练完他
- 完成今日指数的Part03任务8并提交到git 锻炼迁移能力👈
剩余的时间:预习第二天的知识,预习的时候一定要注意:
- 预习不是学习,不要死看第二天的视频(很容易出现看了白看,为了看视频而看视频)
- 预习看第二天的笔记,把笔记中标注重要的知识,可以找到预习视频,先看一遍,如果不懂的 ,记住做好标注。