网站首页 > 技术文章 正文
本文来源视频 https://edu.csdn.net/course/detail/30953
上一讲的json数据源比较单一,有些报表分为表头和明细,比较复杂,我们来看看这种怎么做
我们先来看看要做的报表样式
- 准备个json 文件PurchaseInfo.json放到jaspersoft studio的报表项目里,我们要做一个表头是购买人的基本信息,明细时购买记录的这样一个报表。
{
"loginId": "lisi",
"address": "长安大街1号",
"phone": "13344444444",
"loginName": "李四",
"location": "北京",
"orderList": [{
"orderId": "20200101",
"price": 22.2,
"count": 2,
"purchaseTime": 1595336379791,
"productName": "笔记本"
}, {
"orderId": "20200102",
"price": 222.02,
"count": 1,
"purchaseTime": 1595336379791,
"productName": "硬盘"
}]
}
2.在studio 里切换到 Repository 视图里,创建一个JSON数据源。引用PurchaseInfo.json文件
3.创建报表模板 SampleMain.jrxml,
主报表数据源选择json中的用户信息的字段。
?
4.将抬头字段拖到到报表模板里的TITLE位置,并拖动子报表元素到detail里。
?
?
?
5.创建子报表SampleSub.jrxml,创建过程和普通报表一样。子报表保留detail区域,其余删掉。
?
6.选择子报表数据源 ,选择orderList双击到了右边的框里,点Read Fields,下方列出购买记录的所有字段。
?
7.设置子报表,选择子报表模板,拖动字段到子报表模板里。也可以给子报表设置写表格,背景色等。
?
8.回到主报表模板,进行设置。在Outline窗口创建一个自定义的Parameter-subPath,代表子报表的路径。并进行Expression,Data source Express 的配置。
$P{subPath}+"Sample2sub1.jasper",((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("orderList")
?
?
?
9.先编译子报表,再编译主报表,点击预览,输入subPath的路径。
?
10.java代码的编写
@GetMapping(value = "/reportjson3")
public void reportjson3(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
String reportName ="sample2.jasper";
response.setContentType("application/pdf; charset=utf-8");
response.setDateHeader("Expires", 0);
OutputStream os = response.getOutputStream();
JasperReport jasperReport = (JasperReport)JRLoader.loadObject(resourceLoader.getResource("classpath:/jasper1/"+reportName).getInputStream());
String subPath = resourceLoader.getResource("classpath:/jasper1/").getURL().toString();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("subPath", subPath);
String json = buildJson();
System.out.println(json);
InputStream inputStream = new ByteArrayInputStream(json.getBytes("UTF-8"));
hashMap.put("JSON_INPUT_STREAM", inputStream); //填充报表数据源数据流
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, hashMap);
JasperExportManager.exportReportToPdfStream(jasperPrint,os);
} catch (Exception e) {
e.printStackTrace();
}
}
猜你喜欢
- 2024-12-25 Spring Boot整合Spring Cloud GateWay代理第三方应用的调用接口?
- 2024-12-25 Java 近期新闻:Hibernate 6.0、JobRunr 5.0、JHipster 7.8.0
- 2024-12-25 Keycloak Servlet Filter Adapter使用
- 2024-12-25 如何在Spring Boot中保证RESTful接口的安全性?
- 2024-12-25 Java项目实战第6天:登录业务的实现
- 2024-12-25 JavaEE概述总结:Servlet生命周期+JSP内置对象
- 2024-12-25 SpringBoot 无感刷新 Token springboot的token
- 2024-12-25 若依开发框架解析笔记(7)-jwt的应用
- 2024-12-25 Spring MVC中提供了哪些扩展机制?如何使用这些扩展机制?
- 2024-12-25 49个Spring经典面试题总结(附带答案)
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 527℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 492℃MySQL service启动脚本浅析(r12笔记第59天)
- 472℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 469℃启用MySQL查询缓存(mysql8.0查询缓存)
- 450℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 429℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 426℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)