#苍穹外卖# (day 12)
目录
day12 数据统计Excel报表
1 工作台
1 界面展示
2 需求分析
2 Apache POI
导出运营数据Excel报表
1 Controller层导出运营数据报表
2 Service业务层接口实现
3 Service层接口实现类
day12 数据统计Excel报表
1 工作台
1 界面展示
2 需求分析
接口设计:
-
今日数据接口
-
订单管理接口
-
菜品总览接口
-
套餐总览接口
-
订单搜索接口(已完成)
-
各个状态的订单数量统计接口(已完成)
2 Apache POI
简单代码示例
package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.FileOutputStream;public class POITest {public static void main(String[] args) {try {testRead();} catch (Exception e) {e.printStackTrace();}}/*** 通过POI创建Excel文件并写入内容*/public static void testWriter() throws Exception {// 在内存当中创建一个Excel文件XSSFWorkbook excel = new XSSFWorkbook();// 显式创建两个Sheet页XSSFSheet employeeInfoSheet = excel.createSheet("员工信息");XSSFSheet employeeAddressSheet = excel.createSheet("员工住址");// 在Sheet页中创建行对象XSSFRow row1 = employeeInfoSheet.createRow(0);XSSFRow row2 = employeeAddressSheet.createRow(0);// 在Excel文件当中创建单元格并设置值row1.createCell(0).setCellValue("xiaoaniter1");row1.createCell(1).setCellValue("xiaoaniter2");row2.createCell(0).setCellValue("xiaoaniter3");row2.createCell(1).setCellValue("xiaoaniter4");// 将Excel文件输出到磁盘中try (FileOutputStream fos = new FileOutputStream("D:\\test1.xlsx")) {excel.write(fos);}// 关闭资源excel.close();}/*** 通过POI读取Excel文件** @throws Exception*/public static void testRead() throws Exception {// 通过文件输入流创建Excel文件FileInputStream fileInputStream = new FileInputStream("D:\\test1.xlsx");XSSFWorkbook excel = new XSSFWorkbook(fileInputStream);//读取Excel文件的第一个sheet页XSSFSheet sheet = excel.getSheetAt(1);for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {XSSFRow row = sheet.getRow(i);for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {System.out.print(row.getCell(j) + "\t");}}excel.close();fileInputStream.close();}
}
导出运营数据Excel报表
业务规则:
- 导出Excel形式的报表文件
- 导出最近30天的运行数据
代码开发实现步骤:
- 1 设计Excel模板文件
- 2 查询最近30天的数据
- 3 将查询的数据填充
- 4 将文件下载到客户端浏览器
代码实现:
1 Controller层导出运营数据报表
/*** 导出运营数据报表** @param response*/@GetMapping("/export")@ApiOperation("导出运营数据报表")public void export(HttpServletResponse response) {reportService.exportBusinessData(response);log.info("导出运营数据报表");}
2 Service业务层接口实现
/*** 导出Excel数据报表** @param response*/void exportBusinessData(HttpServletResponse response);
3 Service层接口实现类
@Autowiredprivate WorkspaceService workspaceService;/*** 导出Excel数据报表** @param response*/@Overridepublic void exportBusinessData(HttpServletResponse response) {//1 查询数据库,获取营业数据(最近三十天)LocalDate begin =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 businessData = workspaceService.getBusinessData(beginTime, endTime);//2 通过POI将数据写道Excel文件中InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");try {assert resourceAsStream != null;//创建工作簿XSSFWorkbook excel = new XSSFWorkbook(resourceAsStream);//填充数据(获取Sheet页)XSSFSheet sheet1 = excel.getSheet("Sheet1");//概览数据//填充数据时间sheet1.getRow(1).getCell(1).setCellValue("时间"+begin + "至" + end);//获取第四行XSSFRow row = sheet1.getRow(3);//获取第四行row.getCell(2).setCellValue(businessData.getTurnover());//营业额row.getCell(4).setCellValue(businessData.getOrderCompletionRate());//订单完成率row.getCell(6).setCellValue(businessData.getNewUsers());//新增用户row = sheet1.getRow(4);//获取第五行row.getCell(2).setCellValue(businessData.getValidOrderCount());//有效订单数row.getCell(4).setCellValue(businessData.getUnitPrice());//平均客单价//明细数据(最近三十天)for (int i = 0; i < 30; i++) {LocalDate date = begin.plusDays(i);businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN),LocalDateTime.of(date, LocalTime.MAX));//获取指定日期的营业数据row = sheet1.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 outputStream = response.getOutputStream();excel.write(outputStream);outputStream.close();excel.close();log.info("导出Excel数据报表成功");} catch (IOException e) {throw new RuntimeException(e);}}