【SSM】医疗健康平台-管理端-运营数据报表导出

知识目标

  • 熟悉JasperReports的用法,能够使用JasperReports实现PDF文件导出

  • 掌握Excel方式导出运营数据报表的方法,能够使用Apache POI以Excel方式导出运营数据报表

  • 掌握PDF方式导出运营数据报表的方法,能够使用JasperReports以PDF方式导出运营数据报表

在有网络的环境下,传智健康的管理员可以随时随地浏览线上的运营数据报表,但有时候,管理员也希望能将线上的数据导出,独立保存在本地计算机中进行归档,以及做一些其他的数据加工等工作。对此,传智健康提供了两种运营数据报表导出功能,分别是 Excel 方式导出运营数据报表和 PDF 方式导出运营数据报表。接下来,本模块将对管理端的运营数据报表导出进行详细讲解。

10-1 Excel方式导出运营数据报表

运营数据报表的内容是以表格的形式展示的,为了使报表导出之后的数据格式与运营数据报表本身的数据格式保持一致,可以将页面中的报表数据写入 Excel 文件,再通过浏览器进行下载。

在浏览器中访问report_business.html 页面。

在report_business.html页面中,单击“导出Excel”按钮,导出完成后,页面底部显示下载了一个 Excel 格式的文件。

(1)提供Excel模板文件

在backend的template目录下,创建一个名称为report_template的XLSX文件作为模板文件,在该模板文件中创建一个名称为运营数据统计的sheet工作表,工作表中包含会员数据、预约与到诊数据和热门套餐。

(2)提交导出Excel文件的请求

在report_business.html页面中,为“导出 Excel”按钮绑定单击事件,并设置单击时要调用的方法,在该方法中提交导出 Excel 文件的请求。

<div class="excelTitle" ><el-button @click="exportExcel()">导出Excel</el-button>......
</div>

在页面中定义exportExcel()方法用于导出 Excel 文件。

<script>var vue = new Vue({......methods:{//导出Excel报表exportExcel(){window.location.href = '/report/exportBusinessReport.do';}}})
</script>

(3)实现Excel报表下载控制器

在 ReportController 类中定义 exportBusinessReport( )方法,用于接收并处理导出 Excel 文件的请求。 通过调用ReportService接口的getBusinessReportData()方法获取运营数据,并读取数据写入与模板对应的变量或对象中;向模板中写入数据;进行文件下载。

//导出运营数据到Excel并提供客户端下载@RequestMapping("/exportBusinessReport")public Result exportBusinessReport(HttpServletRequest request, HttpServletResponse response){try{//1.获取运营数据,并读取数据写入与模板对应的变量或对象中Map<String,Object> result = reportService.getBusinessReportData();//取出返回结果数据,准备将报表数据写入到Excel文件中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");//2.向模板中写入数据//动态获取Excel模板文件绝对磁盘路径String filePath = request.getSession().getServletContext().getRealPath("template").split("out")[0]+"/web/backend/template"+ File.separator+"report_template.xlsx";//基于POI在内存中创建一个Excel文件XSSFWorkbook excel = new XSSFWorkbook(new FileInputStream(new File(filePath)));XSSFSheet sheet = excel.getSheetAt(0);XSSFRow 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());//占比}//3.文件下载ServletOutputStream out = response.getOutputStream();//创建输出流response.setContentType("application/vnd.ms-excel");//指定响应类型//指定以附件形式下载response.setHeader("content-Disposition","attachment;filename=report.xlsx");excel.write(out);//写入流文件out.flush();//关闭缓冲区的数据流out.close();//关闭流对象excel.close();return null;}catch (Exception e){e.printStackTrace();return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);}}

(4)查询运营数据

在ReportController类的exportBusinessReport()方法中,调用了ReportService接口的getBusinessReportData()方法,该方法之前已经实现,这里不再重复,直接调用即可。

(5)测试 Excel 方式导出运营数据报表

启动服务,在浏览器中访http://localhost:8080/backend/pages/report_business.html。单击“导出Excel”按钮。

10-2 PDF方式导出运营数据报表

PDF 文件在企业办公中很常用,它不仅适合阅读,而且可以防止他人修改文件内容。传智健康管理端提供 PDF 方式导出运营数据报表的功能。

在浏览器中访问 report_business.html 页面。

在 report_business.html 页面单击“导出PDF”按钮,导出完成后,页面底部显示下载了一个PDF 文件。

使用 PDF 方式导出运营数据报表时,需要按照运营数据统计页面的内容分布创建PDF文件,然后将数据填充到 PDF 文件中。在实际企业项目开发中,有两种常见的PDF文件生成方式,具体如下。 iText生成PDF。 JasperReports生成PDF。 由于 iText 的原生 API 编程比较烦琐,为了简化编程过程,在实际项目开发时,大多数情况下使用JasperReports 生成 PDF 文件。对此本任务采用JasperReports结合模板设计器Jaspersoft Studio生成PDF文件。

JasperReports简介

JasperReports是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF、HTML或者XML格式。JasperReports完全由Java语言编写而成,可以用在 J2EE、Web等 Java应用程序中生成动态内容。使用 JasperReports 时,需要导入 JasperReports 的依赖具体如下所示。

JasperReports的工作流程

第1步,创建 JRXML 文件,该文件包含报表布局定义的 XML 文档,可以通过手动编码完成,也可以使用报表设计工具 Jaspersoft Studio 完成。 第2步,使用JasperReports 提供的JasperCompileManager工具将报表模板编译为.jasper 文件; 第3步,使用 JasperReports 提供的 JasperFillManager工具填充编译后的.jasper文件,填充后生成一个.jrprint文件; 第4步,使用文件导出器 JasperExportManager 将.jrprint 文件导出成各种格式的报表文件。

JasperReports入门案例

(1)设计PDF报表模板文件

先使用模板设计器 Jaspersoft Studio 设计入门案例的报表模板文件 demo.jrxml。 将设计好的 demo.jrxml 文件复制到backend 中的template 目录下。

(2)引入JasperReports的依赖

(3)编写单元测试方法

在controller包下创建测试类TestExport,在类中定义testJasperReports( )方法,用于测试导出 PDF 文件。

/*** 测试类*/
public class TestExport {//单元测试方法,测试PDF报表导出@Testpublic void testJasperReports() throws Exception{//获取pdf模板文件绝对磁盘路径String jrxmlPath ="D:\\health\\10\\health_parent\\" +"health_backend\\src\\main\\webapp\\template\\demo.jrxml";String jasperPath="D:\\health\\10\\health_parent\\" +"health_backend\\src\\main\\webapp\\template\\demo.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);//构造数据Map paramters = new HashMap();paramters.put("reportDate","2022-03-01");paramters.put("company","itcast");List<Map> list = new ArrayList();Map map1 = new HashMap();map1.put("name","小明");map1.put("address","beijing");map1.put("email","xiaoming@itcast.cn");Map map2 = new HashMap();map2.put("name","xiaoli");map2.put("address","nanjing");map2.put("email","xiaoli@itcast.cn");list.add(map1);list.add(map2);//填充数据JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath, paramters, new JRBeanCollectionDataSource(list));//输出文件String pdfPath = "D:\\test.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);}
}

(4)测试导出PDF文件

name为中文“小明”的数据没有显示出来,由于JasperReports的jar包中不包含中文的字体库,导致默认情况下中文无法正常显示,对此,可以在程序中导入中文字体库以解决中文无法显示的问题。

(5)导入中文字体库

导入的字体库文件包括fonts.xml和stsong.ttf,其中,fonts.xml用于配置字体信息,stsong.ttf表示华文宋体的字体文件。

 在resources 目录下创建 jasperreports_extension.properties 配置文件,并在配置文件中添加如下配置信息。

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml

(6)修改demo.jrxml

打开demo.jrxml模板文件查看内容,找到模板中需要显示中文的元素,统一将字体设置为华文宋体。

......
<textField><reportElement x="60" y="4" width="100" height="30" uuid="9fd8ea6a-722d-4c35-a4dc-74f3ed490709"/><textElement><font fontName="华文宋体" size="14"/></textElement><textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
......

(7)运行testJasperReports()方法

功能实现

(1)提供PDF模板文件

使用模板设计器 Jaspersoft Studio 设计运营数据报表的模板文件 health_business3.jrxml。 将设计好的模板文件复制到 backend 的 template 目录下。

(2)提交导出PDF文件的请求

在report_business.html 页面,为“导出 PDF”按钮绑定单击事件,并设置单击时要调用的方法,在方法中提交导出 PDF 文件的请求。

<div class="excelTitle" ><el-button @click="exportPDF()">导出PDF</el-button>......
</div>

在report_business.html 页面中定义exportPDF()方法用于导出 PDF 文件。

<script>var vue = new Vue({......methods:{//导出PDF报表exportPDF(){window.location.href = '/report/exportBusinessReport4PDF.do';}}})
</script>

(3)实现PDF报表下载控制器

在ReportController 类中定义exportBusinessReport4PDF( )方法,用于接收并处理导出 PDF 文件的请求。 通过调用ReportService接口的getBusinessReportData( )方法查询运营数据,并将数据存储到集合中返回。 获取PDF模板文件绝对路径,编译模板并向模板中写入数据。 设置响应头信息中的响应类型和文件下载类型,并输出对应的文件。

//导出运营数据到PDF文件并提供下载@RequestMapping("/exportBusinessReport4PDF")public Result exportBusinessReport4PDF(HttpServletRequest request, HttpServletResponse response){try{Map<String,Object> result = reportService.getBusinessReportData();//取出返回结果数据,准备将报表数据写入到Excel文件中List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");//动态获取pdf模板文件绝对磁盘路径String jrxmlPath = request.getSession().getServletContext().getRealPath("template") .split("out")[0]+"/web/backend/template"+ File.separator +"health_business3.jrxml";String jasperPath = request.getSession().getServletContext().getRealPath("template") .split("out")[0]+"/web/backend/template"+ File.separator + "health_business3.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);//填充数据---使用JavaBean数据源方式填充JasperPrint jasperPrint =JasperFillManager.fillReport(jasperPath,result,new JRBeanCollectionDataSource(hotSetmeal));//创建输出流,用于从服务器写数据到浏览器ServletOutputStream out = response.getOutputStream();response.setContentType("application/pdf");response.setHeader("content-Disposition","attachment;filename=report.pdf");//输出文件JasperExportManager.exportReportToPdfStream(jasperPrint,out);out.flush();out.close();return null;}catch (Exception e){e.printStackTrace();return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);}}

(4)查询运营数据

在 ReportController 类的 exportBusinessReport4PDF( )方法中,调用了 ReportService 接口的 getBusinessReportData( )方法查询运营数据,由于在统计分析模块的运营数据统计功能中已经实现了运营数据的查询,这里可以直接调用查询运营数据的相关方法。

(5)测试 PDF 方式导出运营数据报表

启动服务。在浏览器中访问 http://localhost:8080/backend/pages/report_business.html,单击“导出PDF”按钮,以PDF方式导出运营数据。

在report_business.html页面中,单击“导出 PDF”按钮后,浏览器下载了一个名称为 report 的 PDF 文件。

 

模块小结

本模块主要对管理端的运营数据报表导出进行了讲解。首先讲解了 Excel 方式导出运营数据报表;其次讲解了 JasperReports 的使用并实现了 PDF 方式导出运营数据报表。希望通过本模块的学习,可以熟悉JasperReports 的使用,掌握 Excel 方式和 PDF 方式导出运营数据报表的功能。

 

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

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

相关文章

Linux基础 - iptables 与 firewalld 防火墙

目录 零. 简介 一. iptables 二. firewalld 三. 总结 零. 简介 iptables iptables 是 Linux 内核中集成的一种基于命令行的防火墙工具。它通过一系列规则来控制网络数据包的流动&#xff0c;包括允许、拒绝、修改数据包等操作。iptables 可以对入站、出站和转发的数据包进…

Arcgis 计算经纬度坐标并补齐6位小数

工作中我们经常需要在Arcgis中计算点的经纬度或者线的起点、终点坐标&#xff0c;为确保数据的准确性&#xff0c;我们必须保留6位小数&#xff0c;但我们在默认计算的时候偶尔会遇到算出来的经纬度坐标小数位不足6位&#xff0c;那我们应该如何补齐呢&#xff0c;这里我将方法…

结构冒险,控制冒险,数据冒险实例分析

目录 1.结构冒险&#xff1a; 2.数据冒险&#xff1a; 3.控制冒险&#xff1a; 指令执行过程&#xff1a; 取指(IF)&#xff1a;从指令存储器或 Cache 中取指令。 译码/读寄存器(ID)&#xff1a;操作控制器对指令进行译码&#xff0c;同时从寄存器堆中取操作数。 执行/计算地…

黑鹰优化算法(BEO)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、种群初始化 二、围捕行为 三…

centos上快速搭建zfile文件网站

什么是zfile&#xff1f; zfile文件网站是最方便快捷的在线目录展示程序&#xff0c;支持将本地文件、FTP、SFTP、S3、OneDrive 等存储在网站上展示并浏览&#xff01; 本教程参考&#xff1a; https://docs.zfile.vip/install/os-linux复现 今天的搭建环境是centos7.9 第一…

Spring Boot 整合 JSP

Spring Boot 是一个开源的 Java 框架&#xff0c;用于创建独立、生产级的基于 Spring 框架的应用程序。它简化了基于 Spring 的应用程序的创建和部署过程。JSP&#xff08;JavaServer Pages&#xff09;是一种动态网页技术&#xff0c;允许开发者在 HTML 中嵌入 Java 代码。将 …

CSS|03 尺寸样式属性文本与字体属性

尺寸样式属性 height:元素高度height的值&#xff1a;auto 自动length 使用px定义高度% 基于包含它的块级对象的百分比高度 width&#xff1a;元素的宽度width的值与height一样span标签可以设置宽度、高度吗&#xff1f; 答&#xff1a;不可以&#xff0c;因为span标签是一个行…

A-8 项目开源 qt1.0

A-8 2024/6/26 项目开源 由于大家有相关的需求&#xff0c;就创建一个项目来放置相关的代码和项目 欢迎交流&#xff0c;QQ&#xff1a;963385291 介绍 利用opencascade和vulkanscene实现stp模型的查看器打算公布好几个版本的代码放在不同的分支下&#xff0c;用qt实现&am…

科技赋能·创领未来丨智合同和百胜中国就Contract AI Studio项目达成合作

#智合同 #百胜中国 #AIGC #NLP #LLM #Contract AI Studio 近期&#xff0c;国内AIGC和LLM大语言模型发展可谓是如火如荼&#xff0c;其迅速崛起为社会和产业发展起到了非常重要的作用。人们利用AI技术&#xff08;AIGC、LLM大语言模型、NLP等&#xff09;将其赋能到企业生…

华为仓颉编程语言

目录 一、引言 二、仓颉编程语言概述 三、技术特征 四、应用场景 五、社区支持 六、结论与展望 一、引言 随着信息技术的快速发展&#xff0c;编程语言作为软件开发的核心工具&#xff0c;其重要性日益凸显。近年来&#xff0c;华为公司投入大量研发资源&#xff0c;成功…

记录待办事项的便签软件哪个好用?

在快节奏的现代生活中&#xff0c;我们经常需要处理各种各样的待办事项&#xff0c;为了更好地管理时间&#xff0c;许多人选择使用便签软件来记录自己的待办事项。那么&#xff0c;记录待办事项的便签软件哪个好用&#xff1f;市面上众多的便签软件中&#xff0c;哪一个才是最…

【C++题解】1715. 输出满足条件的整数5

问题&#xff1a;1715. 输出满足条件的整数5 类型&#xff1a;简单循环 题目描述&#xff1a; 有这样一个四位数,其千位和百位之和为偶数&#xff0c;十位和个位之和为奇数&#xff0c;且前两位之和大于后两位之和&#xff0c;且含有因数 8 &#xff0c;请输出满足上述条件的…

49-3 内网渗透 - MSI安 装策略提权

靶场环境搭建: 这里还是用我们之前的windows2012虚拟机进行搭建 1)打开一些设置让靶场存在漏洞 打开组策略编辑器(gpedit.msc) 使用运行命令打开: 按下 Win + R 组合键来打开运行对话框。输入 gpedit.msc,然后按下 Enter 键。使用搜索打开: 点击任务栏上的搜索框(W…

【Docker】安装和加速

目录 1.安装 2.了解 docker 信息 3.查询状态 4. 重新启动Docker 1.安装 yum install –y docker 2.了解 docker 信息 cat /etc/redhat-release 3.查询状态 systemctl status docker 4.支持 1.12 的 docker 镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docke…

Unity之Hololens2开发MRTK Profile详解

前言 配置 MRTK 的主要方式之一是使用基础包中的配置文件。 场景中的主要 MixedRealityToolkit 对象具有活动配置文件 - 一个 ScriptableObject。 顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。 此外,这些…

RK3568平台(音频篇)RT5651解码芯片Codec驱动分析

一.Audio Codec的必要性 在理想状况下&#xff0c;对于录音过程&#xff0c;只需要将麦克风获取到的analog信号通过ADC转换为digital信号并存储即可&#xff0c;对于播放音过程&#xff0c;只需要将digital信号通过DAC转换为analog并输出到speaker播放即可。 但在实际的过程中…

【学习】如何利用Python技术进行软件测试相关工作

Python是一种广泛使用的高级编程语言&#xff0c;它因其简洁的语法、强大的库支持和跨平台特性而受到开发者的喜爱。在软件测试领域&#xff0c;Python同样发挥着重要作用&#xff0c;它可以帮助测试人员编写自动化测试脚本、进行接口测试、性能测试、以及处理测试数据等。以下…

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…

华为开发者调试工具使用介绍(MDC)

MDC的开发过程的三大工具&#xff1a;MMC、MDS、Mind Studio&#xff0c;这三个工具完成了开发过程中的配置文件编写、代码编写以及AI模型的开发三个任务。除了开发&#xff0c;MDC还准备了两个调试工具&#xff0c;用于使用过程中数据的查看等。这一些调试工具分别对映射MDC中…

单目标应用:基于鳗鱼和石斑鱼优化器(Eel and grouper optimizer,EGO)的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、鳗鱼和石斑鱼优化器求解微电网 2.1算法简介 鳗鱼和石斑鱼优化器&…