一、工作台
联系昨天
要实现的功能和昨天差不多,都是查询数据。
所以我们就写出查询语句,然后直接导入已经写好的代码。
实现效果
查询语句
今日数据
营业额
select count(amount) from orders
where status=5 and order_time >= #{begin} and order_time <= #{end}
有效订单
select count(*) from orders
where status=5 and order_time >= #{begin} and order_time <= #{end}
订单完成率
所有订单:
select count(*) from orders
where order_time >= #{begin} and order_time <= #{end}
订单完成率 = 有效订单 / 所有订单
平均客单价
平均客单价 = 营业额 / 有效订单
新增用户数
select count(*) from user
where create_time >= #{begin} and create_time <= #{end}
订单数据
待接单
select count(*) from orders
where status=2 and order_time >=#{begin} and order_time <= #{end}
待派送
select count(*) from orders
where status=3 and order_time >=#{begin} and order_time <= #{end}
已完成
select count(*) from orders
where status=5 and order_time >=#{begin} and order_time <= #{end}
已取消
select count(*) from orders
where status=6 and order_time >=#{begin} and order_time <= #{end}
全部订单
select count(*) from orders
where order_time >=#{begin} and order_time <= #{end}
菜品总览
起售菜品
select count(*) from dish
where status=1
停售菜品
select count(*) from dish
where status=1
套餐总览
起售套餐
select count(*) from setmeal
where status=1
停售套餐
select count(*) from setmeal
where status=0
导入代码
下载好黑马该项目的资料:
然后自己导入。
二、Apache POI
介绍
操作Office文件的包。本文该项目中主要用来读写excel表。
应用场景主要在:交易明细、销量统计、批量数据导入(批量添加)
写入Excel
步骤
-
先创建Excel文档/工作簿
-
在工作簿中创建表格
-
在表格中创建行
-
在行中创建单元格
-
往单元格中设置数据
-
将整个Excel文档写到硬盘上
代码
直接在测试类中写例子的测试的。
@Test
public void testWrite() throws IOException {// 1. 创建整个工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 2. 在工作簿中创建表格XSSFSheet sheet1 = workbook.createSheet("表格1");// 3. 在表格中创建行XSSFRow row_1 = sheet1.createRow(1);// 4. 在行中创建单元格XSSFCell cell_1_0 = row_1.createCell(0);// 5. 网单元格中设置数据cell_1_0.setCellValue("哈哈,我是cell_1_0");// 6. 将整个Excel文档写到硬盘上FileOutputStream fos = new FileOutputStream("D:/a.xlsx");workbook.write(fos);// 7. 释放资源fos.close();workbook.close();
}
读出Excel
步骤
-
先创建工作簿,关联本地Excel文档
-
从工作簿中获取表格
-
从表格中获取行
-
从行中获取单元格
-
从单元格中获取数据
代码
@Test
public void testRead() throws IOException {// 1. 先创建工作簿,关联本地Excel文档XSSFWorkbook workbook = new XSSFWorkbook("D:/a.xlsx");// 2. 从工作簿中获取表格XSSFSheet sheet = workbook.getSheetAt(0);// 3. 从表格中获取行XSSFRow row4 = sheet.getRow(3);// 4. 从行中获取单元格 以及 5. 从单元格中获取数据String name = row4.getCell(0).getStringCellValue();String age = row4.getCell(1).getStringCellValue();System.out.println(name);System.out.println(age);XSSFRow row5 = sheet.getRow(4);System.out.println(row5.getCell(0).getStringCellValue());System.out.println(row5.getCell(1).getNumericCellValue());workbook.close();
}
三、导出运营数据
需求分析
导出近30天的运营数据。
步骤
-
读取Excel模版到内存中。
-
准备运营数据
-
将数据写到Excel模板中。
-
将Excel文档响应回浏览器(文件下载)
代码
Controller:
@GetMapping("/export")
@ApiOperation("导出运营数据报表")
public String export(HttpServletResponse response) throws IOException {reportService.exportBusinessData(response);return "OK";
}
Service:
@Override
public void exportBusinessData(HttpServletResponse response) throws IOException{InputStream is = ClassLoader.getSystemResourceAsStream("运营数据报表模板.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(is);LocalDate begin = LocalDate.now().plusDays(-30);LocalDate end = LocalDate.now().plusDays(-1);BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(begin, LocalTime.MIN),LocalDateTime.of(end, LocalTime.MAX));XSSFSheet sheet = workbook.getSheetAt(0);sheet.getRow(1).getCell(1).setCellValue("时间:" + begin + "至" + end);XSSFRow row4 = sheet.getRow(3);row4.getCell(2).setCellValue(businessDataVO.getTurnover());row4.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());row4.getCell(6).setCellValue(businessDataVO.getNewUsers());XSSFRow row5 = sheet.getRow(4);row5.getCell(2).setCellValue(businessDataVO.getValidOrderCount());row5.getCell(4).setCellValue(businessDataVO.getUnitPrice());int i = 0;while (begin.compareTo(end) <= 0) {BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin, LocalTime.MIN),LocalDateTime.of(begin, LocalTime.MAX));XSSFRow row = sheet.getRow(7 + i++);row.getCell(1).setCellValue(begin.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());begin = begin.plusDays(1);}workbook.write(response.getOutputStream());}
注意的点
ClassLoader能加载的文件位置
ClassLoader能加载的文件位置在resources下。
放入resources后需要的操作
需要用maven构建管理的complie编译一下,才能保证类加载器ClassLoader加载到。
创建的POI与Office对应的下标
下标中getRow(0)与getCell(1)对应的分别是第一列第2行的数据。