苍穹外卖项目笔记(12)— 数据统计、Excel报表

前言

代码链接:

Echo0701/take-out⁤ (github.com)

1 工作台

需求分析和设计

产品原型

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

 接口设计

① 今日数据接口: 

② 订单管理接口: 

③ 菜品总览接口:

 ④ 套餐总览接口:

2 Apache POI

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

应用场景:

  • 银行网银系统导出交易明细
  • 各种业务系统导出 Excel 报表
  • 批量导入业务数据

入门案例 

/**
 * 使用POI 操作 Excel 文件
 */
public class POITest {

    /**
     * 通过 POI 创建 excel 文件并写入文件内容
     */
    public static void write() throws Exception {
        //在内存中创建一个excel文件
        XSSFWorkbook excel = new XSSFWorkbook();
        //在 excel 文件中创建一个sheet页
        XSSFSheet sheet = excel.createSheet("info");
        //在sheet页中创建行对象,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("南京");

        //通过输出流,把这个文件从内存写到磁盘里面
        FileOutputStream out = new FileOutputStream("D:\\info.xlsx"); //流对象
        excel.write(out);
        //关闭资源
        out.close();
        excel.close();
    }

    /**
     * 通过 POI 读取 excel 文件中的内容
     * @throws Exception
     */
    public static void read() throws Exception {
        //不能调用无参的方式,要传递一个输入流,从而读取磁盘上的文件,然后封装为一个新的excel文件
        InputStream in = new FileInputStream("D:\\info.xlsx");
        XSSFWorkbook excel = new XSSFWorkbook(in);
        //读取excel文件中的第一个sheet页
        XSSFSheet sheet = excel.getSheetAt(0);//通过下标来获取sheet页
        //获取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);
        }
        //关闭资源
        excel.close();
        in.close();
    }

    public static void main(String[] args) throws Exception {
        write();
        read();
    }
}

3 导出运营数据 Excel 报表 

3.1 需求分析和设计

产品原型

 excel 报表格式

接口设计 

3.2 代码开发

 ReportServiceImpl.java

/**
     * 导出运行数据报表
     * @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(dateBegin, LocalTime.MIN));
        //2、 通过 POI 将数据写入到 Excel 文件中
        //通过输入流读取模板文件 获得类对象.获得类加载器.从类路径下面来读取资源
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");

        try {
            //基于模板文件创建一个新的excel文件
            XSSFWorkbook excel = new XSSFWorkbook(in);
            //获取表格文件的标签页
            XSSFSheet sheet = excel.getSheetAt(0);
            //填充数据 -- 时间
            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()); // 2007-12-03
                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();
        }

    }

}

### 如何导出苍穹外卖系统中的运营数据报表 #### 控制器层实现 在 `ReportController` 中实现了用于导出运营数据报表的功能。该功能通过 HTTP GET 请求触发,并调用了服务层的相应方法来处理实际的数据导出操作。 ```java @GetMapping("/export") @ApiOperation("导出运营数据报表") public void export(HttpServletResponse response){ reportService.exportBusinessData(response); } ``` 此代码片段展示了控制器接收请求并将任务委托给 `reportService` 的过程[^1]。 #### 服务层接口设计 为了确保职责分离和服务可重用性,定义了一个名为 `reportService` 的对象负责具体的业务逻辑执行。这通常涉及到获取必要的数据集以及设置响应头以便浏览器能够识别这是一个文件下载请求。 ```java @Service public class ReportServiceImpl implements ReportService { @Override public void exportBusinessData(HttpServletResponse response) throws IOException { // 设置HTTP响应头部信息 String fileName = "business_data.xlsx"; response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); // 创建Excel工作簿并填充数据... Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("运营数据"); // 假设这里有一些代码用来写入数据到Excel表格... // 将生成的工作簿输出至客户端 try (OutputStream outputStream = response.getOutputStream()) { workbook.write(outputStream); } workbook.close(); } } ``` 这段代码说明了如何配置HTTP响应以支持文件下载,并使用 Apache POI 库创建 Excel 文件[^2]。 #### 数据源与模板化 对于复杂的报告需求,可能还需要考虑从数据库或其他存储位置提取最新数据,并将其按照预定义格式组织成易于理解的形式。此外,还可以利用模板机制简化不同类型的报表开发流程。 #### 安全性和性能优化建议 当涉及大量数据时,应特别注意内存管理和效率问题;同时也要考虑到安全性方面的要求,比如防止恶意用户滥用API端点造成服务器资源耗尽等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值