苍穹外卖Day12 (工作台 Apache POI 导出运营数据Excel报表)
工作台需求分析和设计页面内的名词解释接口设计今日请求数据的接口设计控制层Controller层/** * 工作台今日数据查询 * return */ GetMapping(/businessData) ApiOperation(工作台今日数据查询) public ResultBusinessDataVO businessData(){ //获得当天的开始时间 LocalDateTime begin LocalDateTime.now().with(LocalTime.MIN); //获得当天的结束时间 LocalDateTime end LocalDateTime.now().with(LocalTime.MAX); BusinessDataVO businessDataVO workspaceService.getBusinessData(begin, end); return Result.success(businessDataVO); }Service层/** * 根据时间段统计营业数据 * param begin * param end * return */ public BusinessDataVO getBusinessData(LocalDateTime begin, LocalDateTime end) { /** * 营业额当日已完成订单的总金额 * 有效订单当日已完成订单的数量 * 订单完成率有效订单数 / 总订单数 * 平均客单价营业额 / 有效订单数 * 新增用户当日新增用户的数量 */ Map map new HashMap(); map.put(begin,begin); map.put(end,end); //查询总订单数 select count(*) from orders where order_time gt; begin and order_time lt; end and status null Integer totalOrderCount orderMapper.countByMap(map); map.put(status, Orders.COMPLETED); //营业额 select sum(amount) from orders where order_time gt; begin and order_time lt; end and status 已完成 Double turnover orderMapper.subByMap(map); turnover turnover null? 0.0 : turnover; //有效订单数 select count(*) from orders where order_time gt; begin and order_time lt; end and status 已完成 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; } //新增用户数 select count(*) from user where create_time gt; begin and create_time lt; end Integer newUsers userMapper.countByMap(map); return BusinessDataVO.builder() .turnover(turnover) .validOrderCount(validOrderCount) .orderCompletionRate(orderCompletionRate) .unitPrice(unitPrice) .newUsers(newUsers) .build(); }持久层就是动态sql语句订单管理控制层Controller层/** * 查询订单管理数据 * return */ GetMapping(/overviewOrders) ApiOperation(查询订单管理数据) public ResultOrderOverViewVO orderOverView(){ return Result.success(workspaceService.getOrderOverView()); }Service层/** * 查询订单管理数据 * * return */ public OrderOverViewVO getOrderOverView() { Map map new HashMap(); map.put(begin, LocalDateTime.now().with(LocalTime.MIN)); map.put(status, Orders.TO_BE_CONFIRMED); //待接单 Integer waitingOrders orderMapper.countByMap(map); //待派送 map.put(status, Orders.CONFIRMED); Integer deliveredOrders orderMapper.countByMap(map); //已完成 map.put(status, Orders.COMPLETED); Integer completedOrders orderMapper.countByMap(map); //已取消 map.put(status, Orders.CANCELLED); Integer cancelledOrders orderMapper.countByMap(map); //全部订单 map.put(status, null); Integer allOrders orderMapper.countByMap(map); return OrderOverViewVO.builder() .waitingOrders(waitingOrders) .deliveredOrders(deliveredOrders) .completedOrders(completedOrders) .cancelledOrders(cancelledOrders) .allOrders(allOrders) .build(); }菜品/套餐总览菜品控制层Controller层/** * 查询菜品总览 * return */ GetMapping(/overviewDishes) ApiOperation(查询菜品总览) public ResultDishOverViewVO dishOverView(){ return Result.success(workspaceService.getDishOverView()); }菜品服务层Service层/** * 查询菜品总览 * * return */ public DishOverViewVO getDishOverView() { Map map new HashMap(); map.put(status, StatusConstant.ENABLE); Integer sold dishMapper.countByMap(map); map.put(status, StatusConstant.DISABLE); Integer discontinued dishMapper.countByMap(map); return DishOverViewVO.builder() .sold(sold) .discontinued(discontinued) .build(); }套餐控制层Contoller层/** * 查询套餐总览 * return */ GetMapping(/overviewSetmeals) ApiOperation(查询套餐总览) public ResultSetmealOverViewVO setmealOverView(){ return Result.success(workspaceService.getSetmealOverView()); }套餐服务层Service层/** * 查询套餐总览 * * return */ public SetmealOverViewVO getSetmealOverView() { Map map new HashMap(); map.put(status, StatusConstant.ENABLE); Integer sold setmealMapper.countByMap(map); map.put(status, StatusConstant.DISABLE); Integer discontinued setmealMapper.countByMap(map); return SetmealOverViewVO.builder() .sold(sold) .discontinued(discontinued) .build(); }持久层就是类似的动态查询sql语句Apache POI介绍在Java程序中使用poi需要导入Maven坐标入门案例代码在测试类里面已经写好了一会复习/** * 通过POI创建Excel文件并且写入文件内容 */ public static void write() throws Exception { // 在内存中创建一个Excel文件 XSSFWorkbook excel new XSSFWorkbook(); // 在Excel文件中创建一个Sheet页 XSSFSheet sheet excel.createSheet(info); // 在Sheet中创建行对象ruwnum编号从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(中国); // 通过输出流将内存中的Excel文件写入到磁盘 FileOutputStream out new FileOutputStream(new File(D:\\Java学习存储\\所有项目\\苍穹外卖\\1、黑马程序员Java项目《苍穹外卖》企业级开发实战.zip\\1、黑马程序员Java项目《苍穹外卖》企业级开发实战\\1、黑马程序员Java项目《苍穹外卖》企业级开发实战\\资料\\day12\\test.xlsx)); excel.write(out); // 关闭资源 out.close(); excel.close(); } /** * 通过POI读取Excel文件中的内容 * throws Exception */ public static void read() throws Exception { // 创建一个Excel文件输入流 FileInputStream inputStream new FileInputStream(new File(D:\\Java学习存储\\所有项目\\苍穹外卖\\1、黑马程序员Java项目《苍穹外卖》企业级开发实战.zip\\1、黑马程序员Java项目《苍穹外卖》企业级开发实战\\1、黑马程序员Java项目《苍穹外卖》企业级开发实战\\资料\\day12\\test.xlsx)); // 创建一个Excel工作簿对象 XSSFWorkbook excel new XSSFWorkbook(inputStream); // 读取工作簿中的第一个Sheet页 XSSFSheet sheet excel.getSheetAt(0); // 获取sheet页中最后一行的行号 int lastRowNum sheet.getLastRowNum(); for (int i 1; i lastRowNum; i) { // 获取当前行对象 XSSFRow row sheet.getRow(i); // 获取当前行中第一个单元格中的内容 String stringCellValue1 row.getCell(1).getStringCellValue(); // 获取当前行中第二个单元格中的内容 String stringCellValue2 row.getCell(2).getStringCellValue(); System.out.println(stringCellValue1--stringCellValue2); // 打印 } inputStream.close(); excel.close(); } public static void main(String[] args) throws Exception{ //write(); read(); }导出运营数据 Excel需求分析和设计业务规则接口设计这个接口返回的是个excel文件并不是像之前接口似的返回的json数据代码开发实现步骤这个表的样式可以提前设计好然后再读取往excel表中插入数据直接自己设计好一个excel模板放在resourse资源的template包下接着再通过POI获取到模板后填入数据控制层Controller层/** * 导出运营数据表 * param response */ GetMapping(/export) ApiOperation(导出运营数据表) public void export(HttpServletResponse response){ reportService.exportBusinessData(response); }服务层(Service层)Service层可以调用其他Service层的Api方法这里就是通过创建得excel对象获得sheet页对象行对象单元格对象往里面插入值最后放到response中// 3. 通过输出流将 Excel 文件下载到客户端浏览器 ServletOutputStream out response.getOutputStream(); excel.write(out);/** * 导出营业数据报表 * param response */ Override public void exportBusinessData(HttpServletResponse response) { // 1. 查询数据库获取营业数据--查询近30天的营业数据 // 获取开始时间 LocalDate.now().plusDays(-30) 也同样可以获取 LocalDate begin java.time.LocalDate.now().minusDays(30); LocalDate end LocalDate.now().minusDays(1); LocalDateTime beginTime LocalDateTime.of(begin, LocalTime.MIN); LocalDateTime endTime LocalDateTime.of(end, LocalTime.MAX); // 查询概览数据 BusinessDataVO businessDataVO workspaceService.getBusinessData(beginTime, endTime); try { // 2. 通过 POI 将数据写入到 Excel 文件中 InputStream inputStream this.getClass().getClassLoader().getResourceAsStream(template/运营数据报表模板.xlsx); // 基于模板文件创建一个新的Excel文件 XSSFWorkbook excel new XSSFWorkbook(inputStream); // 获取第一个表单(sheet标签页) XSSFSheet sheet1 excel.getSheet(Sheet1); // 填充数据--时间 sheet1.getRow(1).getCell(1).setCellValue(时间begin至end); // 获得第4行 XSSFRow row sheet1.getRow(3); // 填充数据--营业额 row.getCell(2).setCellValue(businessDataVO.getTurnover()); // 填充数据--订单完成率 row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate()); // 填充数据--新增用户数 row.getCell(6).setCellValue(businessDataVO.getNewUsers()); // 获得第5行 row sheet1.getRow(4); // 填充数据--有效订单数 row.getCell(2).setCellValue(businessDataVO.getValidOrderCount()); // 填充数据--平均客单价 row.getCell(4).setCellValue(businessDataVO.getUnitPrice()); // 填充明细数据 for(int i 0; i 30; i){ LocalDate date begin.plusDays(i); // 查询某一天的营业数据 BusinessDataVO businessData workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX)); // 获得第i7行 row sheet1.getRow(i 7); // 获取单元格 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(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } }