当前位置: 首页 > article >正文

SpringBoot项目里用JasperReport生成PDF报表,从设计到导出网页显示全流程避坑

SpringBoot与JasperReport实战从报表设计到Web端PDF导出的完整解决方案在当今企业级应用开发中报表功能几乎是每个系统的标配需求。无论是财务对账单、销售统计还是运营分析将数据以专业格式呈现的能力直接影响着用户体验。JasperReport作为Java生态中最成熟的报表引擎之一配合SpringBoot的轻量级特性能够快速构建出高性能的报表服务。本文将带你完整走通从模板设计到Web集成的全流程特别聚焦那些官方文档未曾提及的实战细节。1. 环境准备与工具链搭建1.1 Jaspersoft Studio的安装与配置Jaspersoft Studio是设计报表模板的官方IDE最新版本建议从[社区版下载页面]获取。安装时需注意Java版本兼容性v6.17需要JDK 11环境字体预设中文环境下立即安装思源宋体等开源字体工作区编码首次启动时在Preferences General Workspace设置UTF-8# 验证Java环境 java -version # 应显示类似openjdk 11.0.15 2022-04-191.2 SpringBoot项目初始化创建基础项目时除常规Web依赖外需要特别添加dependency groupIdnet.sf.jasperreports/groupId artifactIdjasperreports/artifactId version6.17.0/version /dependency dependency groupIdnet.sf.jasperreports/groupId artifactIdjasperreports-fonts/artifactId version6.17.0/version /dependency提示避免使用system作用域引入字体包这会导致打包后路径解析失败2. 报表模板设计实战2.1 模板结构深度解析在Jaspersoft Studio中新建模板时各区域的实际作用常被误解Band区域渲染时机典型用途Title仅第一页顶部报表标题、公司LOGOPage Header每页顶部列标题、筛选条件说明Detail每条数据记录数据行展示Summary最末页底部合计值、审批栏关键技巧通过右键模板选择Appearance Background设置交替行色比脚本控制更高效。2.2 动态数据源绑定三种主流数据源配置方式对比JavaBean集合ListEmployee data employeeService.listAll(); JRBeanCollectionDataSource ds new JRBeanCollectionDataSource(data);数据库直连Autowired DataSource dataSource; ... Connection conn dataSource.getConnection(); JasperPrint print JasperFillManager.fillReport(template, params, conn);Map参数注入MapString, Object params new HashMap(); params.put(startDate, request.getStartDate()); params.put(department, Sales);注意使用SQL查询时在Studio中要用$P{paramName}声明参数变量3. SpringBoot集成核心逻辑3.1 模板文件加载策略避免硬编码路径的推荐做法Value(classpath:reports/sales_report.jasper) private Resource reportTemplate; public void generateReport(HttpServletResponse response) { InputStream templateStream reportTemplate.getInputStream(); // ...填充数据并输出 }3.2 响应流控制技巧实现PDF预览与下载双模式response.setContentType(application/pdf); // 内联预览模式 response.setHeader(Content-Disposition, inline; filenamereport.pdf); // 或强制下载 // response.setHeader(Content-Disposition, attachment; filenamereport.pdf); ServletOutputStream out response.getOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, out); out.flush();性能优化点对大报表启用分页传输response.setBufferSize(1024 * 1024); // 1MB缓冲区4. 中文显示疑难解决方案4.1 字体配置体系正确部署字体需要三步在resources下建立字体目录结构resources/ └── fonts/ ├── stsong/ │ ├── stsong.TTF │ └── fonts.xml └── jasperreports_extension.propertiesjasperreports_extension.properties内容net.sf.jasperreports.extension.registry.factory.simple.font.familiesnet.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.stsongfonts/stsong/fonts.xmlfonts.xml示例配置fontFamily name华文宋体 normalstsong/stsong.TTF/normal pdfEncodingIdentity-H/pdfEncoding pdfEmbeddedtrue/pdfEmbedded /fontFamily4.2 模板级字体设置在Jaspersoft Studio中选中文本元素在属性面板取消Use font as PDF encoding设置PDF Font Name为配置的字体族名5. 高级功能实现5.1 动态条件过滤结合Spring表达式实现智能查询/* 在jrxml文件中 */ SELECT * FROM orders WHERE 11 #if($P{startDate}) AND create_time $P{startDate} #end #if($P{productType}) AND product_type $P{productType} #end5.2 子报表与交叉表子报表集成要点主报表中定义subreport元素通过dataSourceExpression传递子数据集共享参数需在子报表中声明同名参数subreport reportElement x20 y100 width300 height50/ dataSourceExpression![CDATA[new JRBeanCollectionDataSource($F{items})]]/dataSourceExpression subreportExpression![CDATA[subreports/order_items.jasper]]/subreportExpression /subreport5.3 异步生成与缓存应对大报表的Spring方案Async public Futurebyte[] generateLargeReportAsync(ReportCriteria criteria) { JasperPrint print //...生成逻辑 ByteArrayOutputStream baos new ByteArrayOutputStream(); JasperExportManager.exportReportToPdfStream(print, baos); return new AsyncResult(baos.toByteArray()); }配合缓存注解提升性能Cacheable(value reports, key #criteria.hashCode()) public byte[] getCachedReport(ReportCriteria criteria) { // 生成逻辑 }6. 部署优化实践6.1 资源打包策略Maven资源过滤配置示例build resources resource directorysrc/main/resources/directory filteringtrue/filtering includes include**/*.jasper/include include**/*.properties/include /includes /resource /resources /build6.2 健康检查端点自定义Actuator端点监控报表服务状态Endpoint(id reportengine) Component public class ReportEngineEndpoint { ReadOperation public HealthStatus check() { try { JasperCompileManager.compileReport(...); return HealthStatus.up().build(); } catch (Exception e) { return HealthStatus.down().withDetail(error, e.getMessage()).build(); } } }在项目实际运行中发现模板热加载需求非常普遍。通过结合Spring的ResourceLoader和文件监听机制可以实现模板更新后的自动重载避免每次修改都要重启服务。具体实现可考虑使用JDK的WatchService或Spring Cloud Config的refresh机制。

相关文章:

SpringBoot项目里用JasperReport生成PDF报表,从设计到导出网页显示全流程避坑

SpringBoot与JasperReport实战:从报表设计到Web端PDF导出的完整解决方案 在当今企业级应用开发中,报表功能几乎是每个系统的标配需求。无论是财务对账单、销售统计还是运营分析,将数据以专业格式呈现的能力直接影响着用户体验。JasperReport…...

热键侦探:彻底解决Windows热键冲突的终极方案

热键侦探:彻底解决Windows热键冲突的终极方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾经遇到过…...

告别官方文档!Jetson Nano(JetPack 4.6)离线/内网部署jetson-inference完整流程与资源包分享

Jetson Nano(JetPack 4.6)离线部署jetson-inference全攻略:从资源包制作到内网实战 在工业质检、智慧农业等边缘计算场景中,Jetson Nano常常需要部署在无外网环境的生产线上。去年为某汽车零部件厂商部署缺陷检测系统时,工厂车间完全隔离外网…...

别再乱买线了!一文看懂手机OTG连接U盘、键盘的正确姿势(附Type-C/Micro接口区别)

手机OTG连接全攻略:从U盘到键盘的智能玩法解析 每次看到抽屉里那堆形状各异的USB线材就头疼?明明都是"OTG线",为什么有的能连U盘却识别不了键盘?上周帮同事调试手机外接设备时,发现她买了三条不同接口的OTG线…...

抖音无水印批量下载:3个高效方案解决内容采集难题

抖音无水印批量下载:3个高效方案解决内容采集难题 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …...

DLSS Swapper终极指南:三步解锁游戏性能提升秘籍

DLSS Swapper终极指南:三步解锁游戏性能提升秘籍 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因为游戏帧数太低而烦恼?或者想体验最新DLSS技术但游戏迟迟不更新?DLSS Swa…...

自动驾驶的“夜视眼”如何炼成?深入拆解跨模态图像融合中的对齐难题

自动驾驶的“夜视眼”如何炼成?深入拆解跨模态图像融合中的对齐难题 凌晨3点的城市高架桥上,一辆自动驾驶测试车正以60公里时速巡航。突然,前方200米处出现一个横穿马路的行人——红外传感器捕捉到了人体热辐射,但可见光摄像头因路…...

ADB复杂命令拆解

1、获取包名方法一:最简单直接(手机正在运行该 App)adb shell dumpsys window | findstr mCurrentFocus快速查看当前手机屏幕上,到底是哪个 App 的哪个页面(Activity)正处于显示状态。adb shell&#xff1a…...

告别路径爆破!用RouteVulScan这款Burp插件,精准揪出隐藏的目录遍历漏洞

告别路径爆破!用RouteVulScan精准挖掘隐藏目录漏洞的实战指南 在渗透测试中,最令人头疼的往往不是那些复杂的逻辑漏洞,而是明明存在却难以发现的"低级错误"——比如暴露的.git目录、遗留的备份文件、或是忘记删除的phpinfo页面。传…...

2025_NIPS_Multi-Agent Reinforcement Learning with Communication-Constrained Priors

一、文章主要内容总结 该研究聚焦多智能体强化学习(MARL)在实际场景中面临的通信受限问题(如带宽有限、通信损耗、延迟等),现有方法在可扩展性和鲁棒性上存在不足,难以适配复杂动态环境。为此,提出一套通信受限MARL框架,核心内容包括: 问题建模:将带通信约束的多智能…...

TGRS 2026 即插即用 | 注意力篇 | SFSDF:多尺度空域+多频率频域协同,局部细节+全局结构,全维度特征捕捉!

文章目录 模块出处 模块介绍 模块提出的动机(Motivation) 适用范围与模块效果 模块代码及使用方式 模块出处 Paper:SFIEET: Spectral Frequency-Induced Edge Enhancement Transformer for Hyperspectral Change Detection Code:https://github.com/bcshi83/SFIEET 模块介…...

PMP刷题必备口诀-18(题库+答案详细解析)

刷题必背口诀想提高利润率、降低成本,最有效的方法就是找行业里做得最好的(标杆),看看人家是怎么做的,照着改进。关键逻辑:需要基于已有数据、对标最佳实践找到改进点,实现降本增效工具核心作用…...

Video2X高性能视频处理架构深度解析:C++多线程与硬件加速实现

Video2X高性能视频处理架构深度解析:C多线程与硬件加速实现 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/…...

免费在线抠图透明背景用什么工具工具推荐

做自媒体这几年,平时拍产品、做人像、处理证件照,几乎每天都在琢磨一个问题:在线抠图透明背景用什么工具才能又快又不花钱,还不用下载一堆 App?尤其是 2026 年,各种 AI 工具爆发,但免费的往往带…...

别再死记硬背了!用Python+OpenCV手把手带你玩转YUV与RGB互转(附代码避坑)

PythonOpenCV实战:YUV与RGB互转全解析与避坑指南 在视频处理、计算机视觉和嵌入式开发中,YUV与RGB的格式转换是每个开发者迟早要面对的挑战。想象一下这样的场景:你从Android Camera2 API获取到NV21格式的YUV数据,需要在Python中转…...

[ecapture] gotls:三种模式实现说明与上层应用职责

本文说明 ecapture 中 text(明文)、keylog(仅密钥)、pcapng(网卡密文 密钥) 三种 CaptureMode 在代码层面如何落地,以及 上层应用(消费 ecapture 产出或与之集成的服务)…...

STM32智能门锁避坑指南:RC522读卡、舵机供电、Flash存密码那些容易踩的坑

STM32智能门锁避坑指南:RC522读卡、舵机供电、Flash存密码那些容易踩的坑 当你第一次尝试用STM32搭建智能门锁系统时,可能会被各种硬件和软件的"坑"折磨得焦头烂额。作为一个经历过无数次失败才让门锁稳定运行的老手,我想分享几个最…...

云原生环境中的存储管理:从PV到StorageClass的全面解析

云原生环境中的存储管理:从PV到StorageClass的全面解析 🔥 硬核开场 各位技术大佬们,今天咱们来聊聊云原生环境中的存储管理。别以为存储就是简单的挂载磁盘,在云原生环境中,存储管理涉及PV、PVC、StorageClass、State…...

【初阶数据结构】 归序而上的云阶 堆

📖 点击展开/收起 文章目录 文章目录 1.堆的概念2.堆的接口实现堆的定义2.1 堆的初始化2.2 堆的销毁2.3 获取堆顶数据2.4 堆的向下调整2.5 堆的向上调整2.6 堆的插入2.7 堆顶数据删除2.8 堆的判空 3.完整代码展示Heap.hHeap.c 4.建堆方法1.向上调整建堆2.向下调整建…...

VH6501干扰测试进阶:用CAPL脚本精准控制错误帧的‘连发’与‘间隔’(Repetitions类详解)

VH6501干扰测试进阶:用CAPL脚本精准控制错误帧的‘连发’与‘间隔’(Repetitions类详解) 在汽车电子测试领域,VH6501作为一款专业的CAN总线干扰接口,其核心价值在于能够模拟真实世界中复杂多变的通信故障场景。而真正区…...

Kubernetes网络管理:从CNI到Ingress的全面解析

Kubernetes网络管理:从CNI到Ingress的全面解析 🔥 硬核开场 各位技术大佬们,今天咱们来聊聊Kubernetes网络管理。别以为Kubernetes的网络就是简单的IP分配,实际上它涉及CNI插件、Service、Ingress、NetworkPolicy等多个组件&#…...

Qwen3.5-27B企业落地指南:电商客服/教育答疑/办公提效三大场景应用

Qwen3.5-27B企业落地指南:电商客服/教育答疑/办公提效三大场景应用 1. 企业级AI助手的新选择 在数字化转型浪潮中,企业正寻求更智能的解决方案来提升运营效率。Qwen3.5-27B作为一款视觉多模态理解模型,为企业提供了全新的AI助手选择。这款模…...

从ChatGPT的‘提示词’到图像修复:PromptIR如何用‘提示学习’教会AI看图说话并‘修图’?

PromptIR:当提示学习遇见图像修复,AI如何像ChatGPT一样"看图说话" 你是否曾经对着模糊的老照片叹气,或是被雾霾笼罩的风景照感到无奈?图像修复技术正以前所未有的速度发展,而最新突破PromptIR将自然语言处理…...

别再死记硬背公式了!手把手带你画图推导‘放苹果’问题的状态转移方程

可视化拆解动态规划:从画图到推导‘放苹果’问题的本质 在算法学习的道路上,动态规划(DP)常常是让初学者望而生畏的难关。那些看似神奇的递推公式,往往被当作黑盒魔法般死记硬背。今天,我们要彻底改变这种学…...

D14: 周复盘:人是核心,工具是杠杆

文章目录 D14: 周复盘:人是核心,工具是杠杆 🎯 本周回顾:都发生了什么? 第一周的大事记 数据不会说谎 核心复盘内容 复盘维度一:人的层面——谁在进步,谁在旁观? 复盘维度二:工具层面——哪些工具真的在产生价值? 复盘维度三:流程层面——AI 改变了什么,没改变什么…...

JiYuTrainer深度解析:极域电子教室反控制技术架构揭秘

JiYuTrainer深度解析:极域电子教室反控制技术架构揭秘 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer JiYuTrainer是一款针对极域电子教室系统的专业反控制软件&#…...

1 7.2 网卡的设置

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

实测对比:Faster-LIO vs FastLIO2,iVox到底让我的Livox Mid360快了多少?

Faster-LIO与FastLIO2性能实测:iVox如何提升Livox Mid360的SLAM效率 当Livox Mid360固态激光雷达以每秒240,000点的速度扫描环境时,传统基于ikd-tree的SLAM算法常面临计算瓶颈。去年我们团队在无人机巡检项目中就遭遇过这样的困境——FastLIO2在复杂植被…...

Claude API 注册被拒?国内开发者最全绕坑指南

作为一名在AI工具堆里摸爬滚打的国内开发者,Claude API注册那道坎,我算是结结实实摔过跟头。前阵子为了接入Claude做合同解析工具,光注册就折腾了快一周,踩过的坑能凑成一本"血泪史"。最初我抱着侥幸心理,用…...

终极指南:如何用ViGEmBus虚拟手柄驱动解决Windows游戏兼容性问题

终极指南:如何用ViGEmBus虚拟手柄驱动解决Windows游戏兼容性问题 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾为心爱的Switch手柄无法…...