导出运营数据Excel报表

news2024/9/23 6:11:45

文章目录

    • 概要
    • 整体架构流程
    • 技术细节
    • 小结

概要

产品原型

在数据统计页面,有一个数据导出的按钮,点击该按钮时,其实就会下载一个文件。这个文件实际上是一个Excel形式的文件,文件中主要包含最近30日运营相关的数据。表格的形式已经固定,主要由概览数据和明细数据两部分组成。真正导出这个报表之后,相对应的数字就会填充在表格中,就可以进行存档。

原型图:

需求分析以及接口设计

业务规则:

  • 导出Excel形式的报表文件

  • 导出最近30天的运营数据

技术细节

1.Controller层

/**
     * 导出运营数据Excel表
     * @param response
     */
    @GetMapping("/export")
    @ApiOperation("导出运营数据Excel表")
    public void export(HttpServletResponse response){
        reportService.export(response);
    }

2.Service层:

 /**
     * 导出运营数据Excel表
     * @param httpServletResponse
     */
    public void export(HttpServletResponse httpServletResponse) {
        //1.查询近30天的运营数据
        LocalDateTime begin = LocalDateTime.now().minusDays(30);
        LocalDateTime end = LocalDateTime.now().minusDays(1);
        BusinessDataVO businessData = workspaceService.getBusinessData(begin,end);
        //2.将运营数据写入Excel表
        //2.1读取模版
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/excel.xlsx");
        try {
            //2.2将运营数据填充到模版
            XSSFWorkbook excel = new XSSFWorkbook(inputStream);
            XSSFSheet sheet = excel.getSheet("Sheet1");
            //填充时间
            XSSFRow row = sheet.getRow(1);
            row.getCell(1).setCellValue("时间:" + begin + "~" + end);
            //填充概览数据(第4行)
            row = sheet.getRow(3);
            row.getCell(2).setCellValue(businessData.getTurnover());
            row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
            row.getCell(6).setCellValue(businessData.getNewUsers());
            //第5行
            row = sheet.getRow(4);
            row.getCell(2).setCellValue(businessData.getValidOrderCount());
            row.getCell(4).setCellValue(businessData.getUnitPrice());
            //明细数据(第8行开始)
            for (int i = 0; i < 30; i++) {
                //获取到每一行
                row = sheet.getRow(7 + i);
                //填充一行的数据
                //获取到每一天
                LocalDateTime date = begin.plusDays(i);
                //准备每天的明细数据
                businessData = workspaceService.getBusinessData(date, date.plusDays(1));
                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.下载操作
            ServletOutputStream outputStream = httpServletResponse.getOutputStream();
            excel.write(outputStream);
            //关流
            outputStream.flush();
            outputStream.close();
            inputStream.close();
            excel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言(16)——初识单链表

1.链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结构图&#xff1a; 补充说明&#xff1a; 1、链式机构在逻辑上是连续的&#xff0c;在物理结构上不⼀定连续 2、…

【网络】自定义(应用层)协议——序列化和反序列化

我们接着上一篇&#xff1a;http://t.csdnimg.cn/Xt18d 我们之前写的代码都是在应用层的&#xff0c;而TCP是在应用层下面一层的传输层 1.自定义协议&#xff08;应用层&#xff09; 1.1.应用层和传输层的关系 应用层和传输层的概述 应用层&#xff1a;位于网络协议的最高层…

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(四):纵向运动轨迹规划

参考文章: (1)Apollo6.0代码Lattice算法详解——Part5: 生成横纵向轨迹 (2)自动驾驶规划理论与实践Lattice算法详解 0 前言 纵向运动规划主要是车辆的速度规划,对应于车辆油门和刹车的控制 reference_line和reference_line_info的区别及联系:ReferenceLineInfo 结构中…

全网最最最详细Keepalive的详解

1 Keepalived简介 Keepalived是一款开源的、免费的高可用软件&#xff0c;广泛应用于互联网IT企业中&#xff0c;以其轻量级、配置简单、管理方便等特点受到青睐。以下是Keepalived的详细简介&#xff1a; 1.1 基本概念 定义&#xff1a;Keepalived是一个类似于Layer 3、4 &…

Nginx系列-负载均衡

文章目录 Nginx系列-负载均衡1. 负载均衡基础1.1 负载均衡定义1.2 Nginx负载均衡原理 2. 负载均衡策略2.1 轮询&#xff08;Round Robin&#xff09;2.2 加权轮询&#xff08;Weighted Round Robin&#xff09;2.3 IP哈希&#xff08;IP Hash&#xff09;2.4 最少连接&#xff…

JavaEE----Servlet过滤器

前言 在现代Web开发中&#xff0c;Servlet技术是Java EE&#xff08;Jakarta EE&#xff09;的核心部分。随着Web应用复杂性的增加&#xff0c;Servlet过滤器&#xff08;Filter&#xff09;提供了一种灵活的方法来对请求和响应进行处理 Servlet过滤器是一种特殊的Java对象&a…

C语言钥匙迷宫2.0

目录 开头程序程序的流程图程序游玩的效果结尾 开头 大家好&#xff0c;我叫这是我58。废话不多说&#xff0c;咱们直接开始。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <Windows.h> enum color {Y,B,R …

Linux 开机自动挂载共享文件设置

选择一个要共享的文件 点击确定 -> 确定 启动虚拟机 执行下面的命令 /YumSource 是我选择的共享文件夹&#xff0c;自行替换自已选择的文件夹 mkdir -p /mnt/hgfs cat >> /etc/fstab << EOF .host:/YumSource /mnt/hgfs fuse.vmhgfs-fuse allow_other defaul…

探索生成式AI在文档处理中的应用:llm Whisperer

在现代科技的快速发展中&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;正逐渐改变我们处理文档的方式。虽然许多生成式AI模型在处理文档时表现出色&#xff0c;但面对复杂文档时&#xff0c;大多数开源模型仍显得力不从心。甚至连GPT-4在某些情况下也会遇到…

性能测试-性能监控分析与调优(三)《实战-CPU瓶颈分析、内存问题分析、gc、tomcat性能调优,数据库监控-redis\mysql》

性能监控 使用命令监控 cpu瓶颈分析 top命令 在进行性能测试时使用top命令&#xff0c;界面如下 上图可以看出 - CPU 概况区&#xff1a; %Cpu(s): - us&#xff08;用户进程占用CPU的百分比&#xff09;, 和 sy&#xff08;系统进程占用CPU的百分比&#xff09; 的数…

【16】暴力递归改dp(上)

目录 一.机器人问题 二.最少硬币问题 一.机器人问题 题目&#xff1a;N表示位置1-N&#xff0c;S表示机器人开始位置&#xff0c;e表示结尾位置&#xff0c;k表示机器人必须走k步&#xff0c;问一共有多少种方法&#xff1f; 情况&#xff1a; 如果第1个位置&#xff0c;下次…

交通感知与车路协同系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

PHP—MySQL(PHP连接数据库)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 二、PHP 和 MySQL 的合作方式 三、PHP连接数据库 3.1、MySQLi拓展 ​编辑 3.2、建立与数据库的连接 &#xff08;4&#xff09;创建SQL语句 &#xff08;5&#xff09;获取结果 &#xff08;6&#xff09…

STM32(二):GPIO

GPIO(General Purpose Input Output)通用输入输出口 1.可配置为8种输入输出模式&#xff0c;引脚电平:0V~3.3V&#xff0c;部分引脚可容忍5V&#xff0c;输出模式下可控制端口输出高低电平&#xff0c;用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等&#xff0c;输入模式下…

在vscode使用markdown格式、自动补齐、以及快捷键

在扩展中搜索markdown all in one&#xff0c;下载使用即可。

人工智能在网络安全中的三大支柱

人工智能 (AI) 席卷了网络安全行业&#xff0c;各种供应商都在努力将 AI 融入其解决方案中。但 AI 与安全之间的关系不仅仅在于实现 AI 功能&#xff0c;还在于攻击者和防御者如何利用该技术改变现代威胁形势。它还涉及如何开发、更新和保护这些 AI 模型。如今&#xff0c;网络…

【qt】基于tcp的服务端编写

实现服务端&#xff0c;连接后拿到客户端ip地址和端口号 ui设计 修改对应行编辑对象名&#xff0c;修改客户端ip为clientip,客户端端口号为clientport 代码实现 1.网络通信需要加network 2.包含头文件 3.定义一个QTcpserver变量&#xff0c;并初始化 4.服务端监听&#…

字符串String概述,遍历字符串

String的注意点 字符串的内容是不会发生改变的&#xff0c;它的对象在创建后不能被更改 string是Java定义好的一个类&#xff0c;定义在java.long包中&#xff0c;所以使用的时候不需要导入包。 Java程序中的所有字符串文字&#xff08;例如“abcdefg”&#xff09;&#xf…

【Go语言初探】(二)、项目文件结构和GOPATH设置

一、go语言项目文件结构 由go/bin、go/src和go/pkg三个子文件夹组成&#xff0c;见下图&#xff1a; 实际项目&#xff1a; 二、gopath路径变量设置 在项目中创建main.go文件后&#xff0c;IDE会提示设置GOPATH路径&#xff1a; 点击“configure GOPATH”&#xff0c;设置GOP…

酒项目加密封装步骤;linux查看IP地址,查看MAC地址, 查看CPU序列号

线上酒项目为例 目录 线上酒项目为例 第一步 第二步 linux查看IP地址 查看MAC地址 方法1: 方法2: 方法3&#xff1a; 查看CPU序列号 为什么不用物理机的不同虚拟机的cpu序列号是相同&#xff0c;给我们的各个系统都是相同的 第一步 在maven模块分层上进行加密&#x…