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

news/2024/7/5 3:56:21

前言

代码链接:

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();
        }

    }

}


http://lihuaxi.xjx100.cn/news/1891939.html

相关文章

大模型微调方法:冻结方法 Freeze、P-Tuning 系列、LoRA、QLoRA

大模型微调方法 冻结方法 FreezeP-Tuning 系列Prefix-TuningPrompt TuningP-Tuning v1P-Tuning v2 LoRAQLoRA 冻结方法 Freeze 方法意思是&#xff0c;只用少部分参数训练&#xff0c;把模型的大部分参数冻结。 只要设置微调层的参数&#xff1a; # 遍历模型的所有参数和名称…

小程序 -网络请求post/get

1.1网络请求的概念(post和get) 1.2步骤 1.3 应用函数 js里面写&#xff0c;用bindtap绑在控件上&#xff0c;就不讲了 实例代码&#xff1a; //发起get数据请求get_info(){wx.request({url:https://www.escook.cn/api/get,//请求的接口地址,必须基于https协议//请求的方式met…

Epicypher:CUTANA™ E. coli Spike-in DNA

来源于Escherichia coli&#xff08;E.coli&#xff09;的片段DNA可以用作核酸酶靶向切割和释放&#xff08;CUT&RUN&#xff09;的实验标准化的spike-in对照。产品CUTANA™ E. coli Spike-in DNA含有足够的材料&#xff0c;可用于100-200个CUT&RUN样本&#xff08;高丰…

渗透测试框架——Cobalt Strike

渗透测试框架——Cobalt Strike Cobalt Strike是一款非常成熟的渗透测试框架。Cobalt Strike在3.0版本之前是基于Metasploit框架工作的&#xff0c;可以使用Metasploit的漏洞库。从3.0版本开始&#xff0c;Cobalt Strike不再使用Metasploit的漏洞库&#xff0c;成为一个独立的…

Amazon Aurora Limitless Database:数据库管理的全新境界

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 在当今数亿用户、PB级数据和数百万交易的业务环境中&#xff0c;数…

HCIP---RSTP/MSTP

文章目录 目录 文章目录 前言 一.RSTP诞生背景 二.RSTP对比STP的快速收敛机制 端口角色变化 接口状态变化 RSTP-BPDU 指定端口- P/A机制 BPDU发送变化 端口状态快速切换 优化拓扑变更机制 三.MSTP MSTP诞生背景 MSTP相关概念 MSTP配置 总结 前言 STP协议虽然能够解决环…

事务隔离级别:保障数据库并发事务的一致性与性能

目录 引言 1. 事务隔离级别概述 2. 读未提交隔离级别 3. 读已提交隔离级别 4. 可重复读隔离级别 5. 串行化隔离级别 6. 保障事务隔离级别的机制 7. 如何选择合适的隔离级别 8. 结语 引言 在数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;事务隔离级别是一…

抖捧自动直播是什么,系统功能讲解

目前有在做实体行业级商家服务的老板 你还在为不会直播&#xff0c;不敢直播而苦恼吗&#xff1f; 你还在为想做直播&#xff0c;但没空开直播而焦灼吗&#xff1f; 今天&#xff0c;你的问题都可以统统解决 实体行业直播必备黑科技&#xff1a;抖捧AI自动直播 只需要一部手…