当前位置 博文首页 > yeliner的博客:JasperReports制作报表——Java传参List,Map数据

    yeliner的博客:JasperReports制作报表——Java传参List,Map数据

    作者:[db:作者] 时间:2021-08-01 17:58

    目录

    一、先安装jasper的编写模板工具

    二、制作报表模板

    1.打开Jaspersoft Studio软件,新建jasper report模板文件:File→new→Jasper Report

    2.开始画表

    方法1:把传参数据作为List数据取值

    方法2:把传参数据作为数据源来取值

    三、java传参

    1、读取报表模板

    ?2、装载模板数据

    3、打印pdf?

    ?四、打印效果

    五、jrxml、java文件


    我这里不涉及数据库数据打印,主要为Java传参List<Map<String,Object>>数据打印,在此提供两种画报表的方法及其对应的Java传参方法,,可以先移步打印效果,再看自己需要选择哦~~~~~~~~

    ?

    一、先安装jasper的编写模板工具

    主要有两个工具Jaspersoft Studio、iReport,个人推荐Jaspersoft Studio

    1.安装JaspersoftStudio

    • 链接:https://pan.baidu.com/s/1lCUsRZvqS5smmrdyzImUdA
    • 提取码:7jd5

    2.安装jasper的编写工具iReport Design

    • 链接:https://pan.baidu.com/s/1jxTQPQCNmSBARhwJVVonZQ
    • 提取码:s9t8

    二、制作报表模板

    1.打开Jaspersoft Studio软件,新建jasper report模板文件:File→new→Jasper Report

    新建模板

    3

    2.开始画表

    我这里不涉及数据库数据打印,主要为Java传参List<Map<String,Object>>数据打印,在此提供两种方法

    方法1:把传参数据作为List数据取值

    • Parameters->Create?Parameters, 重命名为dataList: 类型为java.util.List

    4

    • 我们想要获取的dataList数据为List类型,需循环获取数据,因此拖拽Text Field文本框到在Detail区域(关于Title,Page,Header,Colum Header等Band这里不多说啦)
      • 双击Text Filed,Parameters→dataList→get(int),此时值为:$P{dataList}.get(int)
      • 双击int;Variables→COLUMN_COUNT;因为报表的COLUMN_COUNT是从1开始所以需进行-1操作,此时值为:$P{dataList}.get( {$V{COLUMN_COUNT}-1} )
      • 现在获取的是List的一条数据,但我们需要根据key获取HashMap数据,因此还需强制转换
      • 最终值为:((HashMap) $P{dataList}.get({$V{COLUMN_COUNT}-1)).get("C1")
    • 重复获取数据操作,最后点击,最终界面如下:

    ?

    ?

    方法2:把传参数据作为数据源来取值

    这里为了区分新建模板TestMapList2.jrxml

    • Parameters->Create?Parameters, 重命名为dataList: 类型为net.sf.jasperreports.engine.data.JRMapCollectionDataSource
    • 拖拽table至detail区域中,然后一路next
    • ?
    • 双击table
    • outline→Table→Create Column At The Begining,我这里是五列,所以重复操作五次
    • 双击tableData,Fields→Create Field;这里的名称对应java传参数据Map中的key值
    • 此时我们可以直接拖拽file至table的Detail行中;不嫌麻烦的,也可以拖拽Text Filed文本框至Detail再改值
    • 保存,点击,生成jasper文件,最终界面效果如下:

    ?

    三、java传参

    1、读取报表模板

    方法1:读取jrxml文件

    String jrxml ="C:\Users\qyl\JaspersoftWorkspace\MyReports\TestMapList.jrxml";
    JasperReport report = JasperCompileManager.compileReport(jrxml);

    方法2:读取jasper文件

    FileInputStream is = new FileInputStream("C:\\Users\\qyl\\JaspersoftWorkspace\\MyReports\\TestMapList.jasper");
    JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);

    ?2、装载模板数据

    针对制作报表方法1:

     // 设置模板数据
            Map<String,Object> map=new HashMap<String,Object>();       
            List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
            for (int i = 0; i < 4; i++) {
                Map<String, Object> rowMap1 = new HashMap<String, Object>();
                rowMap1.put("C1", "第:" + i + "行1列");
                rowMap1.put("C2", "第:" + i + "行1列");
                rowMap1.put("C3", "第:" + i + "行1列");
                rowMap1.put("C4", "第:" + i + "行1列");
                rowMap1.put("C5", "第:" + i + "行1列");
                dataList.add(rowMap1);
            }
            //设置paramters
            map.put("dataList",dataList);
            JasperPrint jasperPrint = null;
            try {
                jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JRBeanCollectionDataSource(dataList));           
            } catch (JRException e) {
                e.printStackTrace();
            }
    

    针对制作报表方法2:

    //  读取jasper模板文件
            JasperReport jasperReport = null;
            try {
                String jrxml ="C:\\Users\\qyl\\JaspersoftWorkspace\\MyReports\\TestMapList2.jrxml";
                jasperReport = JasperCompileManager.compileReport(jrxml);
                //  此行代码可解决部分打印空页问题
                jasperReport.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL);
            }  catch (JRException e) {
                e.printStackTrace();
            }
    
            // 设置模板数据
            Map<String,Object> map=new HashMap<String,Object>();
            List<Map<String, ?>> dataList = new ArrayList<Map<String, ?>>();
            for (int i = 0; i < 4; i++) {
                Map<String, Object> rowMap1 = new HashMap<String, Object>();
                rowMap1.put("C1", "第:" + i + "行1列"); 
                rowMap1.put("C2", "第:" + i + "行1列");
                rowMap1.put("C3", "第:" + i + "行1列");
                rowMap1.put("C4", "第:" + i + "行1列");
                rowMap1.put("C5", "第:" + i + "行1列");
                dataList.add(rowMap1);
            }
            //设置paramters
            map.put("tableData", new JRMapCollectionDataSource(dataList));
            JasperPrint jasperPrint = null;
            try {
                jasperPrint = JasperFillManager.fillReport(jasperReport, map,  new JREmptyDataSource());
    
            } catch (JRException e) {
                e.printStackTrace();
            }
    

    3、打印pdf?

    方法1:

       
                JRPdfExporter exporter = new JRPdfExporter();
                try {
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, new FileOutputStream("D:\\test1.pdf"));
                    exporter.exportReport();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (JRException e) {
                    e.printStackTrace();
                }

    方法2:

    JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream("D:\\test1.pdf"));

    ?四、打印效果

    第一种报表打印效果:

    第二种报表打印效果:

    ?

    五、jrxml、java文件

    TestMapList.jrxml:第一种报表文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1  -->
    <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="TestMapList" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f5219bfe-d727-4d61-bc48-ac691f75bf56">
    	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    	<style name="FontsStyle" pattern="" fontName="simsun" fontSize="16"/>
    	<parameter name="dataList" class="java.util.List"/>
    	<queryString>
    		<![CDATA[]]>
    	</queryString>
    	<background>
    		<band splitType="Stretch"/>
    	</background>
    	<title>
    		<band height="81" splitType="Stretch">
    			<staticText>
    				<reportElement key="" style="FontsStyle" x="210" y="30" width="100" height="30" uuid="d1b38129-cb40-4c32-9bfd-e642493cf447"/>
    				<text><![CDATA[Method1]]></text>
    			</staticText>
    		</band>
    	</title>
    	<pageHeader>
    		<band height="35" splitType="Stretch"/>
    	</pageHeader>
    	<columnHeader>
    		<band height="61" splitType="Stretch"/>
    	</columnHeader>
    	<detail>
    		<band height="125" splitType="Stretch">
    			<textField>
    				<reportElement style="FontsStyle" x="23" y="10" width="100" height="30" uuid="571918b7-5e2d-43a8-96af-d6d4d9ecc236"/>
    				<textFieldExpression><![CDATA[((HashMap) $P{dataList}.get($V{COLUMN_COUNT}-1)).get("C1")]]></textFieldExpression>
    			</textField>
    			<textField>
    				<reportElement style="FontsStyle" x="123" y="10" width="100" height="30" uuid="55f088f9-1e9a-40eb-b966-ee971fc2f860"/>
    				<textFieldExpression><![CDATA[((HashMap) $P{dataList}.get( $V{COLUMN_COUNT}-1)).get("C2")]]></textFieldExpression>
    			</textField>
    			<textField>
    				<reportElement style="FontsStyle" x="223" y="10" width="100" height="30" uuid="5e20a771-7317-45f1-80b7-23e67a4ccaec"/>
    				<textFieldExpression><![CDATA[((HashMap) $P{dataList}.get( $V{COLUMN_COUNT}-1)).get("C3")]]></textFieldExpression>
    			</textField>
    			<textField>
    				<reportElement style="FontsStyle" x="323" y="10" width="100" height="30" uuid="46c1bed0-c983-4c70-812a-d78864856e8a"/>
    				<textFieldExpression><![CDATA[((HashMap) $P{dataList}.get($V{COLUMN_COUNT}-1)).get("C4")]]></textFieldExpression>
    			</textField>
    			<textField>
    				<reportElement style="FontsStyle" x="423" y="10" width="77" height="30" uuid="f8f216db-0668-44c8-a7b2-04baa49587d6"/>
    				<textFieldExpression><![CDATA[((HashMap) $P{dataList}.get( $V{COLUMN_COUNT}-1)).get("C5")]]></textFieldExpression>
    			</textField>
    		</band>
    	</detail>
    	<columnFooter>
    		<band height="45" splitType="Stretch"/>
    	</columnFooter>
    	<pageFooter>
    		<band height="54" splitType="Stretch"/>
    	</pageFooter>
    	<summary>
    		<band height="42" splitType="Stretch"/>
    	</summary>
    </jasperReport>
    

    TestJ.java:第一种报表传参方法

    import net.sf.jasperreports.engine.*;
    import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
    import net.sf.jasperreports.engine.export.JRPdfExporter;
    import net.sf.jasperreports.engine.type.WhenNoDataTypeEnum;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class TestJ {
        public static void main(String args[]) throws FileNotFoundException {
            //  读取jasper模板文件
            JasperReport jasperReport = null;
            try {
                String jrxml ="C:\\Users\\qyl\\JaspersoftWorkspace\\MyReports\\TestMapList.jrxml";
                jasperReport = JasperCompileManager.compileReport(jrxml);
                //  此行代码可解决部分打印空页问题
                jasperReport.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL);
            }   catch (JRException e) {
                e.printStackTrace();
            }
            Map<String, Object> map = new HashMap<String, Object>();
            // 设置模板数据
            List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
            for (int i = 0; i < 4; i++) {
                Map<String, Object> rowMap1 = new HashMap<String, Object>();
                rowMap1.put("C1", "第:" + i + "行1列");
                rowMap1.put("C2", "第:" + i + "行1列");
                rowMap1.put("C3", "第:" + i + "行1列");
                rowMap1.put("C4", "第:" + i + "行1列");
                rowMap1.put("C5", "第:" + i + "行1列");
                dataList.add(rowMap1);
            }
            //设置paramters
            map.put("dataList", dataList);
            JasperPrint jasperPrint = null;
            try {
                jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JRBeanCollectionDataSource(dataList));
                // 生成PDF客户端
                JRPdfExporter exporter = new JRPdfExporter();
                try {
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, new FileOutputStream("D:\\test1.pdf"));
                    exporter.exportReport();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (JRException e) {
                    e.printStackTrace();
                }
            } catch (JRException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    TestMapList2.jrxml:第二种报表文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1  -->
    <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="TestMapList2" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="829526aa-68b5-46ce-8066-5de7152978fd">
    	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    	<style name="Table_TH" mode="Opaque" backcolor="#F0F8FF">
    		<box>
    			<pen lineWidth="0.5" lineColor="#000000"/>
    			<topPen lineWidth="0.5" lineColor="#000000"/>
    			<leftPen lineWidth="0.5" lineColor="#000000"/>
    			<bottomPen lineWidth="0.5" lineColor="#000000"/>
    			<rightPen lineWidth="0.5" lineColor="#000000"/>
    		</box>
    	</style>
    	<style name="Table_CH" mode="Opaque" backcolor="#BFE1FF">
    		<box>
    			<pen lineWidth="0.5" lineColor="#000000"/>
    			<topPen lineWidth="0.5" lineColor="#000000"/>
    			<leftPen lineWidth="0.5" lineColor="#000000"/>
    			<bottomPen lineWidth="0.5" lineColor="#000000"/>
    			<rightPen lineWidth="0.5" lineColor="#000000"/>
    		</box>
    	</style>
    	<style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
    		<box>
    			<pen lineWidth="0.5" lineColor="#000000"/>
    			<topPen lineWidth="0.5" lineColor="#000000"/>
    			<leftPen lineWidth="0.5" lineColor="#000000"/>
    			<bottomPen lineWidth="0.5" lineColor="#000000"/>
    			<rightPen lineWidth="0.5" lineColor="#000000"/>
    		</box>
    	</style>
    	<subDataset name="tableData" uuid="4226918e-1ff9-4408-8de4-2e76c71c7fee">
    		<queryString>
    			<![CDATA[]]>
    		</queryString>
    		<field name="C1" class="java.lang.String"/>
    		<field name="C2" class="java.lang.String"/>
    		<field name="C3" class="java.lang.String"/>
    		<field name="C4" class="java.lang.String"/>
    		<field name="C5" class="java.lang.String"/>
    	</subDataset>
    	<parameter name="tableData" class="net.sf.jasperreports.engine.data.JRMapCollectionDataSource"/>
    	<queryString>
    		<![CDATA[]]>
    	</queryString>
    	<background>
    		<band splitType="Stretch"/>
    	</background>
    	<title>
    		<band height="79" splitType="Stretch"/>
    	</title>
    	<pageHeader>
    		<band height="35" splitType="Stretch"/>
    	</pageHeader>
    	<columnHeader>
    		<band height="61" splitType="Stretch"/>
    	</columnHeader>
    	<detail>
    		<band height="250" splitType="Stretch">
    			<componentElement>
    				<reportElement x="0" y="20" width="560" height="190" uuid="b79910ab-8363-47db-ac2f-9bb8a932a533">
    					<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
    					<property name="com.jaspersoft.studio.table.style.table_header" value="Table_TH"/>
    					<property name="com.jaspersoft.studio.table.style.column_header" value="Table_CH"/>
    					<property name="com.jaspersoft.studio.table.style.detail" value="Table_TD"/>
    					<property name="com.jaspersoft.studio.components.autoresize.proportional" value="true"/>
    					<property name="net.sf.jasperreports.export.headertoolbar.table.name" value=""/>
    				</reportElement>
    				<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
    					<datasetRun subDataset="tableData" uuid="382413b4-1492-4bb3-8bd9-b10289f44de8">
    						<dataSourceExpression><![CDATA[$P{tableData}]]></dataSourceExpression>
    					</datasetRun>
    					<jr:column width="114" uuid="98a7c929-3c58-4269-8684-51ded050445c">
    						<property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
    						<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
    						<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
    						<jr:columnHeader style="Table_CH" height="30" rowSpan="1"/>
    						<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
    						<jr:detailCell style="Table_TH" height="30">
    							<textField>
    								<reportElement x="0" y="0" width="114" height="30" uuid="8d8a878d-aa9b-4b73-a2e9-15ee880b5950"/>
    								<textElement>
    									<font fontName="simsun" size="10"/>
    								</textElement>
    								<textFieldExpression><![CDATA[$F{C1}]]></textFieldExpression>
    							</textField>
    						</jr:detailCell>
    					</jr:column>
    					<jr:column width="113" uuid="ea717f32-35e7-4638-afa2-2d8b2883678b">
    						<property name="com.jaspersoft.studio.components.table.model.column.name" value="Column2"/>
    						<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
    						<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
    						<jr:columnHeader style="Table_CH" height="30" rowSpan="1"/>
    						<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
    						<jr:detailCell style="Table_TH" height="30">
    							<textField>
    								<reportElement x="0" y="0" width="113" height="30" uuid="43d9e140-235c-4abe-b44b-c438ca6a3e54"/>
    								<textElement>
    									<font fontName="simsun" size="10"/>
    								</textElement>
    								<textFieldExpression><![CDATA[$F{C2}]]></textFieldExpression>
    							</textField>
    						</jr:detailCell>
    					</jr:column>
    					<jr:column width="112" uuid="965df076-9fa3-4941-8018-2a4dbd774f75">
    						<property name="com.jaspersoft.studio.components.table.model.column.name" value="Column3"/>
    						<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
    						<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
    						<jr:columnHeader style="Table_CH" height="30" rowSpan="1"/>
    						<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
    						<jr:detailCell style="Table_TH" height="30">
    							<textField>
    								<reportElement x="0" y="0" width="112" height="30" uuid="eafd6247-d55c-4eff-b075-56d5ece9166c"/>
    								<textElement>
    									<font fontName="simsun" size="10"/>
    								</textElement>
    								<textFieldExpression><![CDATA[$F{C3}]]></textFieldExpression>
    							</textField>
    						</jr:detailCell>
    					</jr:column>
    					<jr:column width="112" uuid="0815bc67-2a15-42a2-8c08-3f01a4f6732f">
    						<property name="com.jaspersoft.studio.components.table.model.column.name" value="Column4"/>
    						<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
    						<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
    						<jr:columnHeader style="Table_CH" height="30" rowSpan="1"/>
    						<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
    						<jr:detailCell style="Table_TH" height="30">
    							<textField>
    								<reportElement x="0" y="0" width="112" height="30" uuid="5ffc3f54-fca1-4281-ae16-628d720c2264"/>
    								<textElement>
    									<font fontName="simsun" size="10"/>
    								</textElement>
    								<textFieldExpression><![CDATA[$F{C4}]]></textFieldExpression>
    							</textField>
    						</jr:detailCell>
    					</jr:column>
    					<jr:column width="109" uuid="2dfe81ed-17d2-4148-adfc-82906bbfdaf0">
    						<property name="com.jaspersoft.studio.components.table.model.column.name" value="Column5"/>
    						<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
    						<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
    						<jr:columnHeader style="Table_CH" height="30" rowSpan="1"/>
    						<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
    						<jr:detailCell style="Table_TH" height="30">
    							<textField>
    								<reportElement x="0" y="0" width="109" height="30" uuid="a9b88f88-40a0-417f-92d0-c3d6ccb5a0e6"/>
    								<textElement>
    									<font fontName="simsun" size="10"/>
    								</textElement>
    								<textFieldExpression><![CDATA[$F{C5}]]></textFieldExpression>
    							</textField>
    						</jr:detailCell>
    					</jr:column>
    				</jr:table>
    			</componentElement>
    		</band>
    	</detail>
    	<columnFooter>
    		<band height="45" splitType="Stretch"/>
    	</columnFooter>
    	<pageFooter>
    		<band height="54" splitType="Stretch"/>
    	</pageFooter>
    	<summary>
    		<band height="42" splitType="Stretch"/>
    	</summary>
    </jasperReport>