Jasper+ireport实现子报表使用json数据源
目前的需求是要在同一个pdf文件里面打印两张表格,使用json数据源并且是不同的数据源。效果图如下↓
这里两张表都是json数据源,主报表采用的是动态数据源,子报表时读取文件里面的数据源。
主报表xml文件如下↓
1 <?xml version="1.0" encoding="UTF-8"?> 2 <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="JsonData" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="204d2c12-6e17-4f5a-88d5-797be11591a1"> 3 <property name="ireport.zoom" value="1.0"/> 4 <property name="ireport.x" value="0"/> 5 <property name="ireport.y" value="0"/> 6 <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false"> 7 <defaultValueExpression><![CDATA["F:\\reportTest\\"]]></defaultValueExpression> 8 </parameter> 9 <queryString language="json"> 10 <![CDATA[sales.item]]> 11 </queryString> 12 <field name="equipment" class="java.lang.String"/> 13 <field name="project" class="java.lang.String"/> 14 <field name="count" class="java.lang.String"/> 15 <title> 16 <band height="79" splitType="Stretch"> 17 <staticText> 18 <reportElement x="137" y="0" width="200" height="20" uuid="dfc1b3b3-97f7-4168-8509-1b611bea72c3"/> 19 <textElement textAlignment="Center"> 20 <font isBold="true"/> 21 </textElement> 22 <text><![CDATA[子报表使用json数据源测试]]></text> 23 </staticText> 24 </band> 25 </title> 26 <columnHeader> 27 <band height="20"> 28 <staticText> 29 <reportElement x="75" y="0" width="100" height="20" uuid="1c9641be-6be2-486b-91e9-b61394a54cb7"/> 30 <box> 31 <topPen lineWidth="1.0"/> 32 <leftPen lineWidth="1.0"/> 33 <bottomPen lineWidth="1.0"/> 34 <rightPen lineWidth="1.0"/> 35 </box> 36 <text><![CDATA[equipment]]></text> 37 </staticText> 38 <staticText> 39 <reportElement x="175" y="0" width="100" height="20" uuid="61761013-f83f-4847-a308-ebb19beceacd"/> 40 <box> 41 <topPen lineWidth="1.0"/> 42 <leftPen lineWidth="1.0"/> 43 <bottomPen lineWidth="1.0"/> 44 <rightPen lineWidth="1.0"/> 45 </box> 46 <text><![CDATA[project]]></text> 47 </staticText> 48 <staticText> 49 <reportElement x="275" y="0" width="100" height="20" uuid="0620aa0a-e5b6-4c89-940e-cb464d774026"/> 50 <box> 51 <topPen lineWidth="1.0"/> 52 <leftPen lineWidth="1.0"/> 53 <bottomPen lineWidth="1.0"/> 54 <rightPen lineWidth="1.0"/> 55 </box> 56 <text><![CDATA[count]]></text> 57 </staticText> 58 </band> 59 </columnHeader> 60 <detail> 61 <band height="20"> 62 <textField> 63 <reportElement x="75" y="0" width="100" height="20" uuid="24ed5267-5dd7-449c-ab3c-ccb5ceb627a2"/> 64 <box> 65 <topPen lineWidth="0.75"/> 66 <leftPen lineWidth="0.75"/> 67 <bottomPen lineWidth="0.75"/> 68 <rightPen lineWidth="0.75"/> 69 </box> 70 <textFieldExpression><![CDATA[$F{equipment}]]></textFieldExpression> 71 </textField> 72 <textField> 73 <reportElement x="175" y="0" width="100" height="20" uuid="8d50db0b-645c-4ec8-8fb3-579e2bab2b13"/> 74 <box> 75 <topPen lineWidth="0.75"/> 76 <leftPen lineWidth="0.75"/> 77 <bottomPen lineWidth="0.75"/> 78 <rightPen lineWidth="0.75"/> 79 </box> 80 <textFieldExpression><![CDATA[$F{project}]]></textFieldExpression> 81 </textField> 82 <textField> 83 <reportElement x="275" y="0" width="100" height="20" uuid="dee5fca0-ff07-4166-b81a-1035c94518ca"/> 84 <box> 85 <topPen lineWidth="0.75"/> 86 <leftPen lineWidth="0.75"/> 87 <bottomPen lineWidth="0.75"/> 88 <rightPen lineWidth="0.75"/> 89 </box> 90 <textFieldExpression><![CDATA[$F{count}]]></textFieldExpression> 91 </textField> 92 </band> 93 </detail> 94 <summary> 95 <band height="148" splitType="Stretch"> 96 <subreport> 97 <reportElement x="0" y="0" width="555" height="148" uuid="7a8dcc6f-51eb-449b-8887-296672171b47"/> 98 <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "JsonData_subreport1.jasper"]]></subreportExpression> 99 </subreport> 100 </band> 101 </summary> 102 </jasperReport>
子报表xml文件如下↓
1 <?xml version="1.0" encoding="UTF-8"?> 2 <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="JsonData_subreport1" pageWidth="555" pageHeight="802" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="e3ad0c84-019d-458e-b9b7-ef798faab90e"> 3 <property name="ireport.zoom" value="1.0"/> 4 <property name="ireport.x" value="0"/> 5 <property name="ireport.y" value="0"/> 6 <property name="net.sf.jasperreports.json.source" value="F:\Users\Desktop\lib\json.json"/> 7 <queryString language="json"> 8 <![CDATA[item2]]> 9 </queryString> 10 <field name="item" class="java.lang.String"/> 11 <field name="quantity" class="java.lang.String"/> 12 <columnHeader> 13 <band height="50"> 14 <staticText> 15 <reportElement x="73" y="30" width="100" height="20" uuid="964539ea-f556-426c-b571-5bc12ccacad0"/> 16 <box> 17 <topPen lineWidth="0.75"/> 18 <leftPen lineWidth="0.75"/> 19 <bottomPen lineWidth="0.75"/> 20 <rightPen lineWidth="0.75"/> 21 </box> 22 <text><![CDATA[item]]></text> 23 </staticText> 24 <staticText> 25 <reportElement x="173" y="30" width="100" height="20" uuid="6578bf25-ff51-41c8-939f-5c40236770dd"/> 26 <box> 27 <topPen lineWidth="0.75"/> 28 <leftPen lineWidth="0.75"/> 29 <bottomPen lineWidth="0.75"/> 30 <rightPen lineWidth="0.75"/> 31 </box> 32 <text><![CDATA[quantity]]></text> 33 </staticText> 34 </band> 35 </columnHeader> 36 <detail> 37 <band height="20"> 38 <textField> 39 <reportElement x="73" y="0" width="100" height="20" uuid="72cae18f-36f8-42b4-b5a6-8dd35ab6e5a4"/> 40 <box> 41 <topPen lineWidth="1.0"/> 42 <leftPen lineWidth="1.0"/> 43 <bottomPen lineWidth="1.0"/> 44 <rightPen lineWidth="1.0"/> 45 </box> 46 <textElement> 47 <font fontName="微软雅黑"/> 48 </textElement> 49 <textFieldExpression><![CDATA[$F{item}]]></textFieldExpression> 50 </textField> 51 <textField> 52 <reportElement x="173" y="0" width="100" height="20" uuid="063a6d61-e009-495a-acd5-9dae33f9379d"/> 53 <box> 54 <topPen lineWidth="1.0"/> 55 <leftPen lineWidth="1.0"/> 56 <bottomPen lineWidth="1.0"/> 57 <rightPen lineWidth="1.0"/> 58 </box> 59 <textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression> 60 </textField> 61 </band> 62 </detail> 63 </jasperReport>
Java代码如下↓
1 package a.test.xmlfile; 2 3 import java.io.BufferedReader; 4 import java.io.ByteArrayInputStream; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.InputStreamReader; 9 import java.util.HashMap; 10 import java.util.Locale; 11 12 import net.sf.jasperreports.engine.JRParameter; 13 import net.sf.jasperreports.engine.JasperCompileManager; 14 import net.sf.jasperreports.engine.JasperFillManager; 15 import net.sf.jasperreports.engine.JasperPrint; 16 import net.sf.jasperreports.engine.JasperReport; 17 import net.sf.jasperreports.engine.design.JasperDesign; 18 import net.sf.jasperreports.engine.query.JsonQueryExecuterFactory; 19 import net.sf.jasperreports.engine.xml.JRXmlLoader; 20 import net.sf.jasperreports.view.JasperViewer; 21 22 public class SubJsonDataTest { 23 public static String ReadFile(String Path) { 24 BufferedReader reader = null; 25 String laststr = ""; 26 try { 27 FileInputStream fileInputStream = new FileInputStream(Path); 28 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8"); 29 reader = new BufferedReader(inputStreamReader); 30 String tempString = null; 31 while ((tempString = reader.readLine()) != null) { 32 laststr += tempString; 33 } 34 reader.close(); 35 } catch (IOException e) { 36 e.printStackTrace(); 37 } finally { 38 if (reader != null) { 39 try { 40 reader.close(); 41 } catch (IOException e) { 42 e.printStackTrace(); 43 } 44 } 45 } 46 return laststr; 47 } 48 49 public static void main(String[] args) { 50 //这里注意更改路径 51 String s = ReadFile("F:\\Users\\Desktop\\lib\\tianjin.json"); 52 JasperDesign design; 53 try { 54 // 注意更改路径 55 design = JRXmlLoader.load("F:\\reportTest\\JsonData.jrxml"); 56 HashMap<String, Object> paramsMap = new HashMap<String, Object>(); 57 // 第二种配置数据源的方式 InputStream 58 InputStream is = new ByteArrayInputStream(s.getBytes("UTF-8")); 59 paramsMap.put("JSON_INPUT_STREAM", is); 60 // 配置其他参数 61 paramsMap.put(JsonQueryExecuterFactory.JSON_LOCALE, Locale.ENGLISH); 62 paramsMap.put(JRParameter.REPORT_LOCALE, Locale.US); 63 // 加载模板 64 JasperReport report = JasperCompileManager.compileReport(design); 65 // 填充数据 66 JasperPrint print = JasperFillManager.fillReport(report, paramsMap); 67 // 预览显示 68 JasperViewer.viewReport(print); 69 70 } catch (Exception e) { 71 // TODO Auto-generated catch block 72 e.printStackTrace(); 73 } 74 } 75 76 }
主报表数据源如下↓
1 { "sales": { 2 "item": [ 3 { 4 5 "equipment": "equipment1", 6 "project": "project1", 7 "count": "1" 8 }, 9 { 10 11 "equipment": "equipment2", 12 "project": "project2", 13 "count": "1" 14 }, 15 { 16 17 "equipment": "equipment3", 18 "project": "project3", 19 "count": "1" 20 }, 21 { 22 23 "equipment": "equipment4", 24 "project": "project4", 25 "count": "1" 26 }, 27 { 28 29 "equipment": "equipment5", 30 "project": "project5", 31 "count": "1" 32 } 33 ] 34 }}
子报表数据源如下↓
1 { 2 "item2": [ 3 { 4 "id": "1", 5 "item": "Book", 6 "quantity": "15", 7 "unitprice": "10" 8 }, 9 { 10 "id": "2", 11 "item": "PDA", 12 "quantity": "5", 13 "unitprice": "100" 14 }, 15 { 16 "id": "2", 17 "item": "测试", 18 "quantity": "5", 19 "unitprice": "100" 20 } 21 ], 22 "field": "test" 23 }
友情提示一,子报表存放的路径要和下图划线的地方一致
本文版权归__馋猫和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
友情提示二,如果报错如下图所示,说明虽然有了子报表的xml文件,但是没有Jasper文件,此时只需要在ireport里面预览一下子报表,就会生成Jasper文件。