在 jaspersoft studio 中处理多个数据源

Working with multiple data sources in jaspersoft studio

根据 能够将来自 java bean 的自定义数据源添加到报告后,我进入了使用 jasper 进行报告的第二点。

我有一个使用数据库作为数据源的主报表。然后我向报告添加一个 bean.xml 数据源,并向使用此 bean.xml 数据源获取 java beans 的主报告添加一个 table。

My goal is to get a field value from the main report and manipulate its value, then fill the beans with these values and at last fill the table with the beans.

为此,我编写了 3 个 classes,我在 table 数据集 [=47] 中用作 Scriptlet =]:

这是我需要做的事情的说明:

问题出在 FillTable class,当我使用 String kNFormelGG = (String) this.getParameterValue("gg"); 创建的 bean.xml 与 java.lang.reflect.InvocationTargetException

的测试连接失败时
Caused by: java.lang.NullPointerException
at net.sf.jasperreports.engine.JRAbstractScriptlet.getParameterValue(JRAbstractScriptlet.java:95)
at net.sf.jasperreports.engine.JRAbstractScriptlet.getParameterValue(JRAbstractScriptlet.java:86)
at org.iqtig.reporting.dataSource.bean.dataSourceXML.FillTable.fillTable(FillTable.java:45)
at org.iqtig.reporting.dataSource.bean.dataSourceXML.JRDataSourceFactory.createCollection(JRDataSourceFactory.java:27)
... 34 more

如果我分配一个像 String kNFormelGG ="Test me" 这样的固定值,bean 连接不会遇到任何错误,并且在将 bean.xml 分配为 Dataset1 中的默认数据适配器的值后,它会用静态填充 table值。 如何从主报表数据源动态获取参数或值的数据并在 bean 中使用它? 我假设在从我的适配器调用静态工厂 class 时,这些字段仍然是空的。也许我错了,但我没有找到关于这个问题的任何其他声明。

BeanFactory Class

import java.util.Collection;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;

/**
 * Factory for TableCellsBean Klasse
 *
 * @author iman.gharib
 */

public class JRDataSourceFactory extends JRDefaultScriptlet {

/**
 * @return collection der TableCellsBean Objekten
 * @throws JRScriptletException
 */
public static Collection<TableCellsBean> createCollection()
        throws JRScriptletException {
    FillTable ft = new FillTable();
    Collection<TableCellsBean> reportRows = ft.fillTable();
    return reportRows;
}

}

豆子Class

public class TableCellsBean {

private String fieldName;
private String keyFormel;
private String mK;
private String notation;
private String item;

/**
 * Constructor.
 *
 * @param fieldName
 * @param keyFormel
 * @param mK
 * @param notation
 * @param item
 */
public TableCellsBean(final String fieldName, final String keyFormel, final String mK, final String notation, final String item) {
    this.fieldName = fieldName;
    this.keyFormel = keyFormel;
    this.mK = mK;
    this.notation = notation;
    this.item = item;
}

/**
 * Constructo Leer
 */
public TableCellsBean() {

}
public TableCellsBean getme() {
    return this;
}
// getter and setters
}

Class 用于准备和创建 bean

public class FillTable extends JRDefaultScriptlet {
@Override
public void afterColumnInit()
        throws JRScriptletException {
    fillTable();
}
public ArrayList<String> splitGGArray(final String kNFormelGG) {
    ArrayList<String> fieldNames = new ArrayList<>();
    String[] array = (kNFormelGG.split(" "));
    for (String sub : array) {
        fieldNames.add(sub);
    }
    return fieldNames;
}
public Collection<TableCellsBean> fillTable()
        throws JRScriptletException {
 // gg is a parameter for table dataset. It is mapped to KN_FormelGG
 // which comes from the main report data base 
    String kNFormelGG = (String) this.getParameterValue("gg");
    List<TableCellsBean> listTableCells = new ArrayList<>();
    // TableCellsBean tableCell = new TableCellsBean();
    for (String fn : splitGGArray(kNFormelGG)) {
        listTableCells.add(new TableCellsBean(fn, fn, fn, fn, fn));
        // listTableCells.add(tableCell);
    }
    // JRBeanCollectionDataSource tableCellJRBean = new JRBeanCollectionDataSource(listTableCells);
    // Map<String, Object> parameters = new HashMap<>();
    // parameters.put("FieldDataSource", tableCellJRBean);
    return listTableCells;
}
}

JRXML

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.0.final using JasperReports Library version 6.3.0  -->
<!-- 2016-08-08T14:30:03 -->
<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="main" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4f1480cf-f8f9-420f-96b4-7fc1e41e791b">
    <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="QIDBReport"/>
    <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="Dataset1" uuid="5677929d-813b-4d39-828c-de966a9d7689">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="bean.xml"/>
        <property name="net.sf.jasperreports.data.adapter" value="bean.xml"/>
        <scriptlet name="Scriptlet_1" class="org.iqtig.reporting.dataSource.bean.mapBeanAsDatasource.JRDataSourceFactory"/>
        <parameter name="gg" class="java.lang.String"/>
        <field name="item" class="java.lang.String">
            <fieldDescription><![CDATA[item]]></fieldDescription>
        </field>
        <field name="fieldName" class="java.lang.String">
            <fieldDescription><![CDATA[fieldName]]></fieldDescription>
        </field>
        <field name="me" class="org.iqtig.reporting.dataSource.bean.dataSourceXML.TableCellsBean">
            <fieldDescription><![CDATA[me]]></fieldDescription>
        </field>
        <field name="keyFormel" class="java.lang.String">
            <fieldDescription><![CDATA[keyFormel]]></fieldDescription>
        </field>
        <field name="mK" class="java.lang.String">
            <fieldDescription><![CDATA[mK]]></fieldDescription>
        </field>
    </subDataset>
    <parameter name="LB_ID" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[62]]></defaultValueExpression>
    </parameter>
    <parameter name="KN_OffeziellGruppe" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[3]]></defaultValueExpression>
    </parameter>
    <parameter name="FieldDataSource" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource" isForPrompting="false"/>
    <parameter name="KN_FormelGG" class="java.lang.String" isForPrompting="false"/>
    <queryString>
        <![CDATA[select * from "KennzahlReferenz2015_QIBericht",  "Images" 
where LB_ID =  $P{LB_ID} 
and KN_OffiziellGruppe =  $P{KN_OffeziellGruppe}
and  IMG_ID = 1]]>
    </queryString>
    <field name="QI_Praefix" class="java.lang.String"/>
    <field name="KN_Id" class="java.lang.Integer"/>
    <field name="bewertungsArtTypNameKurz" class="java.lang.String"/>
    <field name="refbereich" class="java.lang.String"/>
    <field name="refbereichVorjahres" class="java.lang.String"/>
    <field name="KN_GGAlleinstehend" class="java.lang.String"/>
    <field name="erlaueterungDerRechregeln" class="java.lang.String"/>
    <field name="teildatensatzbezug" class="java.lang.String"/>
    <field name="mindesanzahlZaeler" class="java.lang.Integer"/>
    <field name="mindesanzahlNenner" class="java.lang.Integer"/>
    <field name="KN_FormelZ" class="java.lang.String"/>
    <field name="KN_FormelGG" class="java.lang.String"/>
    <field name="verwendeteFunktionen" class="java.lang.String"/>
    <field name="idLb" class="java.lang.String"/>
    <field name="LB_LangBezeichnung" class="java.lang.String"/>
    <field name="LB_ID" class="java.lang.Integer"/>
    <field name="nameAlleinstehend" class="java.lang.String"/>
    <field name="KN_BezeichnungAlleinstehendKurz" class="java.lang.String"/>
    <field name="QI_ID" class="java.lang.Integer"/>
    <field name="IMG_ID" class="java.lang.Integer"/>
    <field name="Name" class="java.lang.String"/>
    <field name="Image" class="java.lang.Object"/>
    <group name="id" isStartNewPage="true">
        <groupExpression><![CDATA[$F{KN_Id}]]></groupExpression>
        <groupHeader>
            <band height="44"/>
        </groupHeader>
        <groupFooter>
            <band height="50"/>
        </groupFooter>
    </group>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="44" splitType="Stretch"/>
    </title>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <columnHeader>
        <band height="34" splitType="Stretch"/>
    </columnHeader>
    <detail>
        <band height="149" splitType="Stretch">
            <componentElement>
                <reportElement x="170" y="20" width="350" height="100" uuid="38d917fb-dfc2-4c08-890a-09cfe6e2214d">
                    <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="net.sf.jasperreports.export.headertoolbar.table.name" value=""/>
                    <property name="com.jaspersoft.studio.components.autoresize.proportional" value="true"/>
                </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" whenNoDataType="AllSectionsNoDetail">
                    <datasetRun subDataset="Dataset1" uuid="1b3548f6-7d6b-4070-bb8e-aaefbabdc7c9">
                        <datasetParameter name="gg">
                            <datasetParameterExpression><![CDATA[$F{KN_FormelGG}]]></datasetParameterExpression>
                        </datasetParameter>
                    </datasetRun>
                    <jr:column width="70" uuid="048812d7-0ed1-4db8-a09a-e6242f77c6ce">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="70" height="30" uuid="c5aaea84-1367-41df-be8d-7f71e3ea5153"/>
                                <textFieldExpression><![CDATA[$F{item}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="70" uuid="11b85ada-c9fe-42b6-a646-8bd1697cdec2">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column2"/>
                        <jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="70" height="30" uuid="728ff44d-1dbd-404c-b8b3-7cc0e1f07f60"/>
                                <textFieldExpression><![CDATA[$F{fieldName}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="70" uuid="892f30cb-fb41-444f-889b-1e005484c35e">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column3"/>
                        <jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="70" height="30" uuid="e38ac951-71bc-45a6-8ed2-313805a77050"/>
                                <textFieldExpression><![CDATA[$F{keyFormel}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="70" uuid="7d0d700a-5a75-4c26-94c0-9ef7c53bd719">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column4"/>
                        <jr:tableHeader style="Table_TH" height="30" rowSpan="1">
                            <textField>
                                <reportElement x="0" y="0" width="70" height="30" uuid="68577007-0344-406c-8aa2-3127d1da1c65"/>
                            </textField>
                        </jr:tableHeader>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="70" height="30" uuid="873d63c1-1b91-4441-b7bd-f67db7729e7f"/>
                                <textFieldExpression><![CDATA[$F{mK}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="70" uuid="cf5a1a2f-594d-429f-8925-62d001e1dd00">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column5"/>
                        <jr:tableHeader style="Table_TH" height="30" rowSpan="1">
                            <textField>
                                <reportElement x="0" y="0" width="70" height="30" uuid="7fb46eb8-d0e1-44ab-89f9-ec31d49b8109"/>
                                <textFieldExpression><![CDATA[$P{gg}]]></textFieldExpression>
                            </textField>
                        </jr:tableHeader>
                        <jr:detailCell style="Table_TD" height="30"/>
                    </jr:column>
                </jr:table>
            </componentElement>
            <textField>
                <reportElement x="20" y="80" width="100" height="30" uuid="b89cd04c-2569-43ef-9730-445b874855dd"/>
                <textFieldExpression><![CDATA[$F{KN_FormelGG}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="20" y="32" width="100" height="30" uuid="e91b4461-5e53-4f85-8992-14e69a1aa05f"/>
                <text><![CDATA[KN_FormelGG]]></text>
            </staticText>
        </band>
    </detail>
    <columnFooter>
        <band height="45" splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band height="54" splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band height="42" splitType="Stretch"/>
    </summary>
</jasperReport>

My goal is to get a field value from the main report and manipulate its value, then fill the beans with these values and at last fill the table with the beans.

我将忽略您的所有 scriplet 和其他代码,并向您展示使用当前字段、变量或参数值为另一个组件创建动态数据源的最简单方法。

作为示例,我们将在 field1 (row1, row2)

中包含这些字符串值
Test1_1.23:Test2_4.32:Test3_1.08
Test1_2.12:Test2_5.12:Test3_2.13

我们想在 : 上拆分并创建行(bean 列表),然后在 _ 上拆分以创建列(bean 上的属性)并将其显示在 jr:table 中组件。

java代码(或Bean)

public class TableCellsBean {

    private String name;
    private double value;

    public TableCellsBean(String name,double value){
        this.name = name;
        this.value = value;
    }
    public static JRBeanCollectionDataSource getDatasource(String fieldValue){
        List<TableCellsBean> retList = new ArrayList<>();
        String[] values = fieldValue.split(":");
        for (String v : values) {
            String[] sp = v.split("_");
            retList.add(new TableCellsBean(sp[0], Double.parseDouble(sp[1])));
        }
        return new JRBeanCollectionDataSource(retList);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getValue() {
        return value;
    }
    public void setValue(double value) {
        this.value = value;
    }
}

正如您已经在这个 bean 中看到的那样 class 我添加了一个静态方法,该方法 return 是一个 JRBeanCollectionDataSource 取决于作为参数传递的值。

基本上你传递一个 fieldValue 给这个方法,它做一些逻辑,创建 TableCellBean,将它们添加到列表和 return 一个 JRBeanCollectionDataSource

Note: The method does not need to be static nor inside this class, furthermore exception handling is not considered.

报告-jrxml

在示例中,我们将 field1 包含第 1 行的 Test1_1.23:Test2_4.32:Test3_1.08 和第 2 行的 Test1_2.12:Test2_5.12:Test3_2.13

我们定义了一个子数据集来表示 TableCellsBean

<subDataset name="table_dataset" uuid="4dc1b0fb-2588-4f98-8c8d-f0afefbb2fd1">
    <field name="name" class="java.lang.String"/>
    <field name="value" class="java.lang.Double"/>
 </subDataset>

作为数据源,我们调用静态方法传递当前行中的 field1 内容。

<dataSourceExpression><![CDATA[my.package.TableCellsBean.getDatasource($F{field1})]]></dataSourceExpression>

完整 jrxml

<?xml version="1.0" encoding="UTF-8"?>
<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="test" language="java" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="886a547e-11bd-434b-a330-d93ee5e4a280">
    <style name="table">
        <box>
            <pen lineWidth="1.0" lineColor="#000000"/>
        </box>
    </style>
    <style name="table_TH" mode="Opaque" backcolor="#F0F8FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="table_CH" mode="Opaque" backcolor="#BFE1FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="table_TD" mode="Opaque" backcolor="#FFFFFF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <subDataset name="table_dataset" uuid="4dc1b0fb-2588-4f98-8c8d-f0afefbb2fd1">
        <field name="name" class="java.lang.String"/>
        <field name="value" class="java.lang.Double"/>
    </subDataset>
    <field name="field1" class="java.lang.String">
        <fieldDescription><![CDATA[_THIS]]></fieldDescription>
    </field>
    <detail>
        <band height="40" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="555" height="20" uuid="a73343b1-ccb2-4a59-b882-381b98efd664"/>
                <textElement verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$F{field1}]]></textFieldExpression>
            </textField>
            <componentElement>
                <reportElement key="table" style="table" x="0" y="20" width="555" height="20" uuid="09a9a5b8-499b-40d2-b391-ece25772a31e"/>
                <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="table_dataset" uuid="05601bdb-5579-4253-90f7-6742739d9714">
                        <dataSourceExpression><![CDATA[bounty.TableCellsBean.getDatasource($F{field1})]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="90" uuid="afbbb3d0-573a-495d-ab51-0ae4d601e6fb">
                        <jr:tableHeader style="table_TH" height="20" rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0" width="90" height="20" uuid="e476f026-bbec-4b19-9bd4-f4b21f3377ef"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <text><![CDATA[Name]]></text>
                            </staticText>
                        </jr:tableHeader>
                        <jr:detailCell style="table_TD" height="20" rowSpan="1">
                            <textField>
                                <reportElement x="0" y="0" width="90" height="20" uuid="49cac181-b16b-4ab3-b600-78a56fb0f42b"/>
                                <box leftPadding="3" rightPadding="3"/>
                                <textElement verticalAlignment="Middle"/>
                                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="90" uuid="4a1b0759-c347-4294-82c5-3aed4762f0c4">
                        <jr:tableHeader style="table_TH" height="20" rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0" width="90" height="20" uuid="bfa965b5-b5a4-484d-bfbd-d8bc753718b1"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <text><![CDATA[Value]]></text>
                            </staticText>
                        </jr:tableHeader>
                        <jr:detailCell style="table_TD" height="20" rowSpan="1">
                            <textField>
                                <reportElement x="0" y="0" width="90" height="20" uuid="925192bc-a761-48f5-bad5-097d15587198"/>
                                <box leftPadding="3" rightPadding="3"/>
                                <textElement textAlignment="Right" verticalAlignment="Middle"/>
                                <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </detail>
</jasperReport>


测试示例

添加导出为 pdf 的主要方法

public static void main(String[] args) throws JRException {
    //Compile report
    JasperReport report = JasperCompileManager.compileReport("myJasperReport.jrxml");
    //Setting up some arbitrary data to test the auto creation of datasource
    List<String> someData = new ArrayList<>();
    someData.add("Test1_1.23:Test2_4.32:Test3_1.08");
    someData.add("Test1_2.12:Test2_5.12:Test3_2.13");
    //Fill report
    JasperPrint jasperPrint = JasperFillManager.fillReport(report, new HashMap<>(),new JRBeanCollectionDataSource(someData));
    //Export to pdf
    JRPdfExporter exporter = new JRPdfExporter();       
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("myJasperReport.pdf"));
    SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
    exporter.setConfiguration(configuration);
    exporter.exportReport();
}

输出

结论

根据 运行 报告值(字段、变量、参数)为组件提供自定义数据源的最简单方法是创建一个生成数据源的方法并在 dataSourceExpression