2019-05-09 EasyWeb下使用JasperReport制作主从表

【制作思路】

一个报表模板只能放置一个数据源,当有两个及以上时候,需要使用主报表嵌套子报表;主报表使用数据源方式传入数据,子报表使用参数方式传入数据

【开发注意】

1.报表中使用了二维码,所以需要引入依赖,所有与报表相关的依赖如下

 1         <dependency>
 2             <groupId>net.sf.jasperreports</groupId>
 3             <artifactId>jasperreports</artifactId>
 4             <version>6.8.0</version>
 5         </dependency>
 6         
 7         <!-- jasperreport用到的二维码生成 -->
 8         <dependency>
 9             <groupId>net.sf.barcode4j</groupId>
10             <artifactId>barcode4j</artifactId>
11             <version>2.1</version>
12         </dependency>
13         <dependency>
14             <groupId>com.google.zxing</groupId>
15             <artifactId>core</artifactId>
16             <version>3.3.3</version>
17         </dependency>
18         <dependency>
19             <groupId>com.google.zxing</groupId>
20             <artifactId>javase</artifactId>
21             <version>3.3.3</version>
22         </dependency>

2.需要在报表模板编辑器Parameters中定义存放从表数据的参数detailData

3.在报表模板编辑器中增加Subreport指向子报表模板

4.在Subreport属性中设置Data Source Expression(数据源表达式),通过java类转换成数据源传给子报表

1 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{detailData})

【关键代码】

1.主报表模板

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 6.6.0  -->
  3 <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="order" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="3f7172d1-9779-4750-b9e5-5abc388f7210">
  4     <property name="com.jaspersoft.studio.data.defaultdataadapter" value="demo1"/>
  5     <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
  6     <property name="com.jaspersoft.studio.property.dataset.dialog.DatasetDialog.sash.w1" value="579"/>
  7     <property name="com.jaspersoft.studio.property.dataset.dialog.DatasetDialog.sash.w2" value="410"/>
  8     <parameter name="detailData" class="java.util.List"/>
  9     <parameter name="title" class="java.lang.String"/>
 10     <queryString>
 11         <![CDATA[]]>
 12     </queryString>
 13     <field name="date" class="java.util.Date">
 14         <fieldDescription><![CDATA[date]]></fieldDescription>
 15     </field>
 16     <field name="deptName" class="java.lang.String">
 17         <fieldDescription><![CDATA[deptName]]></fieldDescription>
 18     </field>
 19     <field name="creator" class="java.lang.String">
 20         <fieldDescription><![CDATA[creator]]></fieldDescription>
 21     </field>
 22     <field name="taskCode" class="java.lang.String">
 23         <fieldDescription><![CDATA[taskCode]]></fieldDescription>
 24     </field>
 25     <field name="orderCode" class="java.lang.String">
 26         <fieldDescription><![CDATA[orderCode]]></fieldDescription>
 27     </field>
 28     <field name="id" class="java.lang.String">
 29         <fieldDescription><![CDATA[id]]></fieldDescription>
 30     </field>
 31     <field name="state" class="java.lang.Integer">
 32         <fieldDescription><![CDATA[state]]></fieldDescription>
 33     </field>
 34     <field name="createDate" class="java.util.Date">
 35         <fieldDescription><![CDATA[createDate]]></fieldDescription>
 36     </field>
 37     <background>
 38         <band splitType="Stretch"/>
 39     </background>
 40     <title>
 41         <band height="42" splitType="Stretch">
 42             <textField>
 43                 <reportElement x="180" y="6" width="200" height="30" uuid="1bbd790d-66dd-4152-9ecf-ca82def10e00"/>
 44                 <textElement textAlignment="Center" verticalAlignment="Middle">
 45                     <font fontName="宋体" size="20"/>
 46                 </textElement>
 47                 <textFieldExpression><![CDATA[$P{title}]]></textFieldExpression>
 48             </textField>
 49         </band>
 50     </title>
 51     <pageHeader>
 52         <band height="88" splitType="Stretch">
 53             <staticText>
 54                 <reportElement x="0" y="0" width="40" height="20" uuid="523f3327-2264-445f-b837-5dd6c4018f08"/>
 55                 <textElement>
 56                     <font fontName="宋体" size="14"/>
 57                 </textElement>
 58                 <text><![CDATA[日期]]></text>
 59             </staticText>
 60             <staticText>
 61                 <reportElement x="0" y="30" width="40" height="20" uuid="05b201de-67ab-4ffa-b3cd-695f5f25e3c8"/>
 62                 <textElement>
 63                     <font fontName="宋体" size="14"/>
 64                 </textElement>
 65                 <text><![CDATA[部门]]></text>
 66             </staticText>
 67             <staticText>
 68                 <reportElement x="120" y="0" width="60" height="20" uuid="505f2466-8591-4e6a-a06f-84d46a09be8a"/>
 69                 <textElement>
 70                     <font fontName="宋体" size="14"/>
 71                 </textElement>
 72                 <text><![CDATA[任务单号]]></text>
 73             </staticText>
 74             <staticText>
 75                 <reportElement x="300" y="0" width="60" height="20" uuid="275e5db4-29fe-496f-97d6-e1877e69d1aa"/>
 76                 <textElement>
 77                     <font fontName="宋体" size="14"/>
 78                 </textElement>
 79                 <text><![CDATA[派工单号]]></text>
 80             </staticText>
 81             <staticText>
 82                 <reportElement x="120" y="30" width="60" height="20" uuid="6522ec29-267f-4bba-a3b2-c6c97f264648"/>
 83                 <textElement>
 84                     <font fontName="宋体" size="14"/>
 85                 </textElement>
 86                 <text><![CDATA[制单人]]></text>
 87             </staticText>
 88             <staticText>
 89                 <reportElement x="300" y="30" width="60" height="20" uuid="e87bf7b2-88ed-42bf-a384-40a514c4ae72"/>
 90                 <textElement>
 91                     <font fontName="宋体" size="14"/>
 92                 </textElement>
 93                 <text><![CDATA[制单日期]]></text>
 94             </staticText>
 95             <staticText>
 96                 <reportElement x="0" y="60" width="40" height="20" uuid="522db4c7-92db-43da-8c54-85556594bfd7"/>
 97                 <textElement>
 98                     <font fontName="宋体" size="14"/>
 99                 </textElement>
100                 <text><![CDATA[状态]]></text>
101             </staticText>
102             <textField>
103                 <reportElement x="40" y="0" width="70" height="20" uuid="99f3e0ae-0525-42ea-aa03-0c5c80decd5e"/>
104                 <textElement verticalAlignment="Middle">
105                     <font fontName="宋体"/>
106                 </textElement>
107                 <textFieldExpression><![CDATA[$F{date}]]></textFieldExpression>
108             </textField>
109             <textField>
110                 <reportElement x="40" y="30" width="70" height="20" uuid="40729b5d-b5f5-46a3-bde3-49898de66db2"/>
111                 <textElement verticalAlignment="Middle">
112                     <font fontName="宋体"/>
113                 </textElement>
114                 <textFieldExpression><![CDATA[$F{deptName}]]></textFieldExpression>
115             </textField>
116             <textField>
117                 <reportElement x="180" y="0" width="110" height="20" uuid="02467d83-b5be-4e12-8729-22de35be5fe9"/>
118                 <textElement verticalAlignment="Middle">
119                     <font fontName="宋体"/>
120                 </textElement>
121                 <textFieldExpression><![CDATA[$F{orderCode}]]></textFieldExpression>
122             </textField>
123             <textField>
124                 <reportElement x="180" y="30" width="110" height="20" uuid="b2b3a476-7518-4cae-8011-84da7a2e3df4"/>
125                 <textElement verticalAlignment="Middle">
126                     <font fontName="宋体"/>
127                 </textElement>
128                 <textFieldExpression><![CDATA[$F{creator}]]></textFieldExpression>
129             </textField>
130             <textField>
131                 <reportElement x="360" y="0" width="110" height="20" uuid="e0990b1b-42f4-455a-b8b3-98cc4163bdfd"/>
132                 <textElement verticalAlignment="Middle">
133                     <font fontName="宋体"/>
134                 </textElement>
135                 <textFieldExpression><![CDATA[$F{taskCode}]]></textFieldExpression>
136             </textField>
137             <textField>
138                 <reportElement x="360" y="30" width="110" height="20" uuid="adcd741c-1b9a-4309-a71d-3fe3bd428279"/>
139                 <textElement verticalAlignment="Middle">
140                     <font fontName="宋体"/>
141                 </textElement>
142                 <textFieldExpression><![CDATA[$F{createDate}]]></textFieldExpression>
143             </textField>
144             <textField>
145                 <reportElement x="40" y="60" width="140" height="20" uuid="afbdae73-4cd7-44ab-9f09-fb05f77536b6"/>
146                 <textElement verticalAlignment="Middle">
147                     <font fontName="宋体"/>
148                 </textElement>
149                 <textFieldExpression><![CDATA[$F{state}==0?"保存":($F{state}==1?"下单":"作废")]]></textFieldExpression>
150             </textField>
151             <componentElement>
152                 <reportElement x="460" y="6" width="70" height="70" uuid="67689075-e44b-4c4b-ad2b-d899415a1f4e"/>
153                 <jr:QRCode xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" margin="0">
154                     <jr:codeExpression><![CDATA["master:"+$F{id}]]></jr:codeExpression>
155                 </jr:QRCode>
156             </componentElement>
157             <line>
158                 <reportElement x="-8" y="87" width="570" height="1" uuid="d6a63de9-1c8b-44be-b42e-104952a24eb5"/>
159             </line>
160         </band>
161     </pageHeader>
162     <detail>
163         <band height="100" splitType="Stretch">
164             <subreport>
165                 <reportElement x="-20" y="0" width="595" height="100" uuid="c229f65b-afea-4a9f-abde-195e7321065e"/>
166                 <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{detailData})]]></dataSourceExpression>
167                 <subreportExpression><![CDATA["src/main/resources/jasper/demo1/order-detail.jasper"]]></subreportExpression>
168             </subreport>
169         </band>
170     </detail>
171 </jasperReport>

2.从报表模板

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 6.6.0  -->
 3 <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="order-detail" columnCount="2" printOrder="Horizontal" pageWidth="595" pageHeight="842" columnWidth="277" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="fd47ee62-841a-40bf-8baf-fadfee67070c">
 4     <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
 5     <queryString>
 6         <![CDATA[]]>
 7     </queryString>
 8     <field name="productCode" class="java.lang.String">
 9         <fieldDescription><![CDATA[productCode]]></fieldDescription>
10     </field>
11     <field name="orderNum" class="java.lang.String">
12         <fieldDescription><![CDATA[orderNum]]></fieldDescription>
13     </field>
14     <field name="id" class="java.lang.String">
15         <fieldDescription><![CDATA[id]]></fieldDescription>
16     </field>
17     <field name="productName" class="java.lang.String">
18         <fieldDescription><![CDATA[productName]]></fieldDescription>
19     </field>
20     <background>
21         <band splitType="Stretch"/>
22     </background>
23     <detail>
24         <band height="102" splitType="Stretch">
25             <staticText>
26                 <reportElement x="90" y="10" width="60" height="20" uuid="02e931c4-a903-492f-a915-fb4f38a8b130"/>
27                 <textElement>
28                     <font fontName="宋体" size="14" isBold="true"/>
29                 </textElement>
30                 <text><![CDATA[产品代码]]></text>
31             </staticText>
32             <staticText>
33                 <reportElement x="90" y="40" width="60" height="20" uuid="98efa39e-7d23-4c1e-bcd6-acf0953c5429"/>
34                 <textElement>
35                     <font fontName="宋体" size="14" isBold="true"/>
36                 </textElement>
37                 <text><![CDATA[产品名称]]></text>
38             </staticText>
39             <staticText>
40                 <reportElement x="90" y="70" width="60" height="19" uuid="33c4eae1-f075-440b-8744-4d816f4167ff"/>
41                 <textElement textAlignment="Left">
42                     <font fontName="宋体" size="14" isBold="true"/>
43                 </textElement>
44                 <text><![CDATA[数  量  ]]></text>
45             </staticText>
46             <textField>
47                 <reportElement x="160" y="10" width="110" height="20" uuid="a565adea-bac5-4406-95b5-900def774984"/>
48                 <textElement verticalAlignment="Middle">
49                     <font fontName="宋体"/>
50                 </textElement>
51                 <textFieldExpression><![CDATA[$F{productCode}]]></textFieldExpression>
52             </textField>
53             <textField>
54                 <reportElement x="160" y="40" width="105" height="20" uuid="8222b996-e9b4-4b51-a314-990341b1f5d2"/>
55                 <textElement verticalAlignment="Middle">
56                     <font fontName="宋体"/>
57                 </textElement>
58                 <textFieldExpression><![CDATA[$F{productName}]]></textFieldExpression>
59             </textField>
60             <textField>
61                 <reportElement x="160" y="70" width="105" height="19" uuid="e5985c93-c08a-4b01-a6ea-b54097e057d3"/>
62                 <textElement verticalAlignment="Middle">
63                     <font fontName="宋体"/>
64                 </textElement>
65                 <textFieldExpression><![CDATA[$F{orderNum}]]></textFieldExpression>
66             </textField>
67             <componentElement>
68                 <reportElement x="0" y="10" width="80" height="80" uuid="1293a5a8-ac25-44d0-a17a-d055c6bcbd31"/>
69                 <jr:QRCode xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" margin="0">
70                     <jr:codeExpression><![CDATA["detail:"+$F{id}]]></jr:codeExpression>
71                 </jr:QRCode>
72             </componentElement>
73             <line>
74                 <reportElement x="0" y="101" width="270" height="1" forecolor="#BFB2B2" uuid="1f835a86-88bb-4647-bcb1-290e79355507"/>
75             </line>
76         </band>
77     </detail>
78 </jasperReport>

3.后端Java 代码

 1 @RequestMapping("/report")
 2     public void getReport(String orderID,HttpServletRequest request, HttpServletResponse response) throws Exception {
 3         // 主表数据放入主报表模板渲染数据源
 4         List<Object> list = new ArrayList<Object>();
 5         ProductOrderExample example1 = new ProductOrderExample();
 6         example1.createCriteria().andIdEqualTo(orderID);
 7         list.add(productOrderService.list(example1, 1, 1).getData().get(0));
 8         
 9         
10         HashMap<String, Object> parameters = new HashMap<String, Object>();
11         
12         // 从表数据放入主报表模板参数detailData
13         ProductOrderDetailExample example2 = new ProductOrderDetailExample();
14         example2.createCriteria().andOrderIDEqualTo(orderID);
15         parameters.put("detailData",productOrderDetailService.list(example2, 0, 0).getData());
16         // 设置报表标题参数
17         parameters.put("title","生产派工单");
18         
19         
20         JasperReportUtils.printPdf2HtmlByJavaBean(request, response, "classpath:jasper/demo1/order.jasper",parameters ,list );
21 
22 
23     }

4.上面涉及的printPdf2HtmlByJavaBean封装代码

 1     /**
 2      * 使用JavaBean填充打印PDF到Html中
 3      * @param request
 4      * @param response
 5      * @param jasperPath 例如:classpath:jasper/report2.jasper
 6      * @param list JavaBean数据
 7      * @param parameters 
 8      * @throws Exception
 9      */
10     public static void printPdf2HtmlByJavaBean(HttpServletRequest request, HttpServletResponse response,String jasperPath,Map<String, Object> parameters,List<?> list) throws Exception {
11 
12         ServletOutputStream outputStream = response.getOutputStream();
13 
14         //获取报表的编译文件,后面要将对其进行填充数据
15         String path = URLDecoder.decode(ResourceUtils.getURL(jasperPath).getPath(),"UTF-8");
16         
17         FileInputStream inputStream =new FileInputStream(new File(path));
18 
19         //由于没有数据,故这里使用空参数和空数据源,该方法需要抛出JRException异常
20         JasperRunManager.runReportToPdfStream(inputStream, outputStream, parameters , new JRBeanCollectionDataSource(list));
21 
22         // 输出PDF
23         response.setContentType("application/pdf");
24 
25         // 关闭资源
26         outputStream.flush();
27         outputStream.close();
28         inputStream.close();
29         
30     }

【最终效果】

原文地址:https://www.cnblogs.com/WongHugh/p/10840831.html