Java学习Day58:相声二人组!(项目统计数据Excel图表导出)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html"><head><!-- 页面meta --><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>瑞通健康</title><meta name="description" content="瑞通健康"><meta name="keywords" content="瑞通健康"><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"><!-- 引入样式 --><link rel="stylesheet" href="../plugins/elementui/index.css"><link rel="stylesheet" href="../plugins/font-awesome/css/font-awesome.min.css"><link rel="stylesheet" href="../css/style.css"><style>.grid-content {border-radius: 4px;min-height: 40px;}</style></head><body class="hold-transition"><div id="app"><div class="content-header"><h1>统计分析<small>运营数据</small></h1><el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb"><el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item><el-breadcrumb-item>统计分析</el-breadcrumb-item><el-breadcrumb-item>运营数据</el-breadcrumb-item></el-breadcrumb></div><div class="app-container"><div class="box" style="height: 900px"><div class="excelTitle" ><el-button @click="exportExcel">导出Excel</el-button>运营数据统计</div><div class="excelTime">日期:{{reportData.reportDate}}</div><table class="exceTable" cellspacing="0" cellpadding="0"><tr><td colspan="4" class="headBody">会员数据统计</td></tr><tr><td width='20%' class="tabletrBg">新增会员数</td><td width='30%'>{{reportData.todayNewMember}}</td><td width='20%' class="tabletrBg">总会员数</td><td width='30%'>{{reportData.totalMember}}</td></tr><tr><td class="tabletrBg">本周新增会员数</td><td>{{reportData.thisWeekNewMember}}</td><td class="tabletrBg">本月新增会员数</td><td>{{reportData.thisMonthNewMember}}</td></tr><tr><td colspan="4" class="headBody">预约到诊数据统计</td></tr><tr><td class="tabletrBg">今日预约数</td><td>{{reportData.todayOrderNumber}}</td><td class="tabletrBg">今日到诊数</td><td>{{reportData.todayVisitsNumber}}</td></tr><tr><td class="tabletrBg">本周预约数</td><td>{{reportData.thisWeekOrderNumber}}</td><td class="tabletrBg">本周到诊数</td><td>{{reportData.thisWeekVisitsNumber}}</td></tr><tr><td class="tabletrBg">本月预约数</td><td>{{reportData.thisMonthOrderNumber}}</td><td class="tabletrBg">本月到诊数</td><td>{{reportData.thisMonthVisitsNumber}}</td></tr><tr><td colspan="4" class="headBody">热门套餐</td></tr><tr class="tabletrBg textCenter"><td>套餐名称</td><td>预约数量</td><td>占比</td><td>备注</td></tr><tr v-for="s in reportData.hotSetmeal"><td>{{s.name}}</td><td>{{s.setmeal_count}}</td><td>{{s.proportion}}</td><td></td></tr></table></div></div></div></body><!-- 引入组件库 --><script src="../js/vue.js"></script><script src="../plugins/elementui/index.js"></script><script type="text/javascript" src="../js/jquery.min.js"></script><script src="../js/axios-0.18.0.js"></script><script>var vue = new Vue({el: '#app',data:{reportData:{reportDate:null,todayNewMember :0,totalMember :0,thisWeekNewMember :0,thisMonthNewMember :0,todayOrderNumber :0,todayVisitsNumber :0,thisWeekOrderNumber :0,thisWeekVisitsNumber :0,thisMonthOrderNumber :0,thisMonthVisitsNumber :0,hotSetmeal :[{name:'阳光爸妈升级肿瘤12项筛查(男女单人)体检套餐',setmeal_count:200,proportion:0.222},{name:'阳光爸妈升级肿瘤12项筛查体检套餐',setmeal_count:200,proportion:0.222}]}},created() {axios.get("/report/getBusinessReportData.do").then((res)=>{this.reportData = res.data.data;});},methods:{exportExcel(){window.location.href = '/report/exportBusinessReport.do';}}})</script>
</html>

后端代码,先查询表上的数据,封装成对应的前端需要的形式的Map集合

@GetMapping("/getBusinessReportData")public Result getBusinessReportData(){Map<Object,Object> reportData=memberService.getReportExcelResult();return new Result(true,"success",reportData);}
/*** reportDate:null,*   todayNewMember :0,*  totalMember :0,*  thisWeekNewMember :0,*  thisMonthNewMember :0,*  todayOrderNumber :0,*  todayVisitsNumber :0,*  thisWeekOrderNumber :0,*  thisWeekVisitsNumber :0,*  thisMonthOrderNumber :0,*  thisMonthVisitsNumber :0,*  hotSetmeal :[* {name:'阳光爸妈升级肿瘤12项筛查(男女单人)体检套餐',setmeal_count:200,proportion:0.222},* {name:'阳光爸妈升级肿瘤12项筛查体检套餐',setmeal_count:200,proportion:0.222}* ]

数据形式如上,封装过程如下:

@Overridepublic Map<Object, Object> getReportExcelResult(){Map<Object,Object> resultMap=new HashMap<>();try {System.out.println("=============================");//reportDateString data= Date2Utils.parseDate2String(new Date());System.out.println(data);resultMap.put("reportDate",data);//todayNewMemberint count = memberMapper.selectCurrentDayMemberCount(data);resultMap.put("todayNewMember",count);//totalMemberint totalMember=memberMapper.seelectTotalMember();resultMap.put("totalMember",totalMember);//thisWeekNewMemberint thisWeekNewMember=memberMapper.selectthisWeekNewMember(data);resultMap.put("thisWeekNewMember",thisWeekNewMember);//thisMonthNewMemberint thisMonthNewMember=memberMapper.selectthisMonthNewMember();resultMap.put("thisMonthNewMember",thisMonthNewMember);//todayOrderNumberint todayOrderNumber=orderSettingMapper.selecttodayOrderNumber();resultMap.put("todayOrderNumber",todayOrderNumber);//thisWeekOrderNumberint thisWeekOrderNumber=orderSettingMapper.selectthisWeekOrderNumber();resultMap.put("thisWeekOrderNumber",thisWeekOrderNumber);//thisMonthOrderNumberint thisMonthOrderNumber=orderSettingMapper.selectthisMonthOrderNumber();resultMap.put("thisMonthOrderNumber",thisMonthOrderNumber);//todayVisitsNumberint todayVisitsNumber=orderSettingMapper.selecttodayVisitsNumber();resultMap.put("todayVisitsNumber",todayVisitsNumber);//thisWeekVisitsNumberint thisWeekVisitsNumber=orderSettingMapper.selectthisWeekVisitsNumber();resultMap.put("thisWeekVisitsNumber",thisWeekVisitsNumber);//thisMonthVisitsNumberint thisMonthVisitsNumber=orderSettingMapper.selectthisMonthVisitsNumber();resultMap.put("thisMonthVisitsNumber",thisMonthVisitsNumber);//hotSetmealList<Map<String,String>> hotSetmeal=new ArrayList<>();hotSetmeal=orderSettingMapper.selecthotSetmeal();resultMap.put("hotSetmeal",hotSetmeal);System.out.println(resultMap);} catch (Exception e) {throw new RuntimeException(e);}return resultMap;}

以下是一组时间范围查询的相关的SQL记录:

    @Select("SELECT COUNT(0) " +"FROM`t_order`  " +"WHERE orderDate = CURDATE() AND orderStatus='已到诊'")int selecttodayVisitsNumber();
 @Select("SELECT COUNT(*) " +"FROM `t_order` " +"WHERE orderDate >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK) " +"  AND orderDate <= CURDATE() AND orderStatus='已到诊';")int selectthisWeekVisitsNumber();
 @Select("SELECT COUNT(*) " +"FROM `t_order` " +"WHERE orderDate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) " +"AND orderDate <= CURDATE() AND orderStatus='已到诊';")int selectthisMonthVisitsNumber();
@Select("SELECT \n" +"    s.`name` AS 'name',\n" +"    COUNT(0) AS 'setmeal_count',\n" +"    COUNT(0) * 1.0 / (SELECT COUNT(*) FROM `t_order`) AS 'proportion'\n" +"    \n" +"FROM \n" +"    `t_order` o \n" +"LEFT JOIN \n" +"    `t_setmeal` s ON o.`setmeal_id` = s.`id`\n" +"GROUP BY \n" +"    s.`id` LIMIT 4;")List<Map<String, String>> selecthotSetmeal();

然后是根据查到的数据导入定制好的格式的Excel表格,并可以使之导出;

 @RequestMapping("/exportBusinessReport")public void exportBusinessReport(HttpServletRequest request, HttpServletResponse response) {Map<Object, Object> result = memberService.getReportExcelResult();String reportDate = (String) result.get("reportDate");Integer todayNewMember = (Integer) result.get("todayNewMember");Integer totalMember = (Integer) result.get("totalMember");Integer thisWeekNewMember = (Integer) result.get("thisWeekNewMember");Integer thisMonthNewMember = (Integer) result.get("thisMonthNewMember");Integer todayOrderNumber = (Integer) result.get("todayOrderNumber");Integer thisWeekOrderNumber = (Integer) result.get("thisWeekOrderNumber");Integer thisMonthOrderNumber = (Integer) result.get("thisMonthOrderNumber");Integer todayVisitsNumber = (Integer) result.get("todayVisitsNumber");Integer thisWeekVisitsNumber = (Integer) result.get("thisWeekVisitsNumber");Integer thisMonthVisitsNumber = (Integer) result.get("thisMonthVisitsNumber");List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");//获得Excel模板文件绝对路径String temlateRealPath = request.getSession().getServletContext().getRealPath("template") +File.separator + "report_template.xlsx";/*** 读取模板文件创建Excel表格对象* File.separator:根据操作系统获取文件分隔符(Windows为\,Linux/Unix为/)*/XSSFWorkbook workbook = null;//初始化XSSFWorkbook对象,用于表示Excel文件。try {//读取Excel模板文件workbook = new XSSFWorkbook(new FileInputStream(new File(temlateRealPath)));//获取Excel的第一个工作表:XSSFSheet sheet = workbook.getSheetAt(0);//示例:获取第3行(索引从0开始),第6个单元格(索引从0开始),并设置其值为reportDateXSSFRow row = sheet.getRow(2);row.getCell(5).setCellValue(reportDate);//日期row = sheet.getRow(4);row.getCell(5).setCellValue(todayNewMember);//新增会员数(本日)row.getCell(7).setCellValue(totalMember);//总会员数row = sheet.getRow(5);row.getCell(5).setCellValue(thisWeekNewMember);//本周新增会员数row.getCell(7).setCellValue(thisMonthNewMember);//本月新增会员数row = sheet.getRow(7);row.getCell(5).setCellValue(todayOrderNumber);//今日预约数row.getCell(7).setCellValue(todayVisitsNumber);//今日到诊数row = sheet.getRow(8);row.getCell(5).setCellValue(thisWeekOrderNumber);//本周预约数row.getCell(7).setCellValue(thisWeekVisitsNumber);//本周到诊数row = sheet.getRow(9);row.getCell(5).setCellValue(thisMonthOrderNumber);//本月预约数row.getCell(7).setCellValue(thisMonthVisitsNumber);//本月到诊数int rowNum = 12;for (Map map : hotSetmeal) {//热门套餐String name = (String) map.get("name");Long setmeal_count = (Long) map.get("setmeal_count");BigDecimal proportion = (BigDecimal) map.get("proportion");row = sheet.getRow(rowNum++);row.getCell(4).setCellValue(name);//套餐名称row.getCell(5).setCellValue(setmeal_count);//预约数量row.getCell(6).setCellValue(proportion.doubleValue());//占比}/*** 获取Servlet的输出流。* 设置响应的内容类型为Excel文件。* 设置响应头,指示浏览器将响应作为附件下载,并指定下载的文件名为report.xlsx。* 将workbook的内容写入输出流。*/ServletOutputStream out = response.getOutputStream();response.setContentType("application/vnd.ms-excel");response.setHeader("content-Disposition", "attachment;filename=report.xlsx");workbook.write(out);/*** 刷新输出流,确保所有数据都被写出。* 关闭输出流和workbook对象,释放资源。*/out.flush();out.close();workbook.close();} catch (IOException e) {throw new RuntimeException(e);}}

知识补充:

1.使用【always-use-default-target="true"】

配置在springSecurity的登陆界面配置中

 <!--配置自己的登录页面--><security:form-login login-page="/login.html" username-parameter="username"password-parameter="password" login-processing-url="/login2.do"default-target-url="/pages/main.html" authentication-failure-url="/login.html"always-use-default-target="true"/>

可以避免登陆后跳转未放行的404或304界面

2.状态码

200:成功

三开头是重定向

302:临时重定向(网站维护或更新、网站结构调整、负载均衡、SEO优化

四开头得是前端错误

400:Bad Request 请求和服务器不匹配,参数类型不匹配

请求的格式、语法或参数不符合服务器的要求

401:没有http认证信息或者认证失败,

在HTTP协议中,401表示未认证的,通常是没有成功登录的

身份验证失败、需要身份验证、访问权限不足被拒绝

403:服务器拒绝请求,可能没有权限,403表示未授权的,

通常是已经登录,但是不具备相关的操作权限。

(验证通过但是权限不足、客户端问题)

404:找不到资源,资源路径有误(资源未找到、资源路径有误

409:请求发生冲突(版本控制冲突、资源状态不匹配、并发请求冲突、权限问题)

五开头的是后端错误

500:内部服务器错误:这是服务器端的错误,与客户端的请求无关,

包括但不限于服务器程序错误、数据库问题、文件权限错误、服务器配置错误等。

502:网关错误,服务器作为网关或代理,从上游服务器收到无效响应

上游服务器无响应或响应超时、网络问题、代理服务器配置错误、后端应用程序错误

503:服务器目前无法使用(由于超载或停机维护)。通常是暂时状态。

服务器超载、服务器维护

504:网关超时

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

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

相关文章

Java实战项目-基于SpringBoot+Vue的二手车交易系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

gulp入门教程5:node-glob

node-glob模块简介 node-glob是一个基于Node.js的文件匹配库&#xff0c;它允许用户使用类似于shell的通配符&#xff08;如*和**&#xff09;来匹配文件路径。这个库基于JavaScript&#xff0c;使用了minimatch库来进行匹配。node-glob在处理大型项目中的文件匹配任务时非常有…

[mysql]数据定义语言DDL和数据操作语言DCL

目录 前文提要 数据定义语言DDL 数据操作语言DML 数据控制语言DCL 基础知识: 标识符(命名规则): 数据定义语言DDL 创建和管理数据库.: 管理数据库 切换数据库 修改数据库 更改数据库字符集 删除数据库 如何创建表 方式1:”白手起家的方式”创建表 方式2:已经有…

[NOIP2006 普及组] 明明的随机数

题目描述 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到 1000 之间的随机整数 (N≤100)&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同的数去掉&#xff0c;不同的数对应着不同…

webpack使用详解

摘要&#xff1a;webpack作为一款主流的构建工具&#xff0c;对比后来者Vite虽然存在一些缺点&#xff0c;例如启动慢&#xff0c;配置复杂等。在很多项目中使用依然基于webpack构建&#xff0c;有必要掌握其概念、构建流程和配置方法。 1 webpack概述 1.1 基本概念 webpack …

基于YOLO11/v10/v8/v5深度学习的维修工具检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

找树根和孩子c++

题目描述 给定一棵树&#xff0c;输出树的根root&#xff0c;孩子最多的结点max以及他的孩子 输入 第一行&#xff1a;n&#xff08;0<结点数<100&#xff09;&#xff0c;m&#xff08;0<边数<200&#xff09;。 以下m行&#xff1b;每行两个结点x和y&#xf…

Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者

近期&#xff0c;《黑神话&#xff1a;悟空》的爆火不仅让 AAA 游戏重回焦点&#xff0c;也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈&#xff0c;对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题&#xff0c;尤其在当前加密市场环…

数据挖掘(七)

数据挖掘&#xff08;七&#xff09; 文章目录 数据挖掘&#xff08;七&#xff09;加载数据集用现有模型进行分类构建网络 寻找子图连通分支 社交网络具有很高的商业价值&#xff0c;比如QQ、微信等拥有大量活跃用户的应用&#xff0c;通过投放广告可以获得不菲的收入。对于网…

深度学习-迁移学习

深度学习中的迁移学习是通过在大规模数据上训练的模型&#xff0c;将其知识迁移到数据相对较少的相关任务中&#xff0c;能显著提升目标任务的模型性能。 一、迁移学习的核心概念 源任务&#xff08;Source Task&#xff09;与目标任务&#xff08;Target Task&#xff09;&…

H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

说明&#xff1a; 很多IC厂家仅发布了内部Flash算法文件&#xff0c;并没有提供读写保护算法文件&#xff0c;也就是选项字节算法文件&#xff0c;需要我们制作。 实际上当前已经发布的TOOL版本&#xff0c;已经自制很多了。但是依然有些厂家还没自制&#xff0c;所以陆续开始…

flutter 写个简单的界面

起因&#xff0c; 目的: 来源: 客户需求。 着急要&#xff0c;我随便写的&#xff0c;应付一下。 过程: 略&#xff0c;直接看代码&#xff0c;看注释。 代码 1 xxx import package:flutter/material.dart;void main() {runApp(const MyApp()); }// # class MyApp extends…

.NET 8 中 Entity Framework Core 的使用

本文代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/89935738 概述 Entity Framework Core (EF Core) 已成为 .NET 开发中数据访问的基石工具&#xff0c;为开发人员提供了强大而多功能的解决方案。随着 .NET 8 和 C# 10 中引入的改进&#xff0c;开发人…

推荐一款可视化和检查原始数据的工具:RawDigger

RawDigger是一款强大的工具&#xff0c;旨在可视化和检查相机记录的原始数据。它被称为一种“显微镜”&#xff0c;使用户能够深入分析原始图像数据&#xff0c;而不对其进行任何更改。RawDigger并不是一个原始转换器&#xff0c;而是一个帮助用户查看将由转换器使用的数据的工…

第三十三章 Vue路由进阶路由模块封装

目录 一、引言 二、完整代码 main.js index.js App.vue Find.vue My.vue 一、引言 在上一个章节中&#xff0c;我们将所有的路由配置都堆在main.js中来实现路径组件的路由&#xff0c;这样做的话非常不利于我们后期对项目的维护。因此正确的做法是将路由模块抽离出来&a…

基于java+SpringBoot+Vue的新闻推荐系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

指派问题的求解

实验类型&#xff1a;◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的&#xff1a;学会使用Matlab求解指派问题。 实验内容&#xff1a;利用Matlab编程实现枚举法求解指派问题。 实验例题&#xff1a;有5人分别对应完成5项工作&#xff0c;其各自的耗费如下表所示&#…

商品满减、限时活动、折扣活动的计算最划算 golang

可以对商品的不同活动&#xff08;如满减、限时价和折扣&#xff09;进行分组&#xff0c;并在购物车中显示各个活动标签下的最优价格组合。以下代码将商品按活动类别进行分组计算&#xff0c;并输出在购物车中的显示信息。 package mainimport ("fmt""math&qu…

AWS RDS Oracle hit ORA-39405

报错信息&#xff1a; ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version 42 into a target database with TSTZ version 35. 分析过程&#xff1a; 这个报错是由于timezone_file的版本&#xff0c;源端比目标端高&#xf…

显卡服务器和普通服务器之间的区别有哪些?

显卡服务器也被称之为GPU服务器&#xff0c;显卡服务器与普通的服务器之间有着很明显的区别&#xff0c;下面就让我们共同来了解一下吧&#xff01; 普通服务器的主要处理器通常都是配备的中央处理器&#xff0c;可以用于执行大部分通用计算任务和操作系统的管理&#xff1b;而…