九、jasperreport 制作json数据源报表(父子报表一)
本文来源视频 https://edu.youkuaiyun.com/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(); } } |













3162





