Java 将自定义数据源添加到Jaspersoft Studio

Java 将自定义数据源添加到Jaspersoft Studio,java,jasper-reports,javabeans,jaspersoft-studio,Java,Jasper Reports,Javabeans,Jaspersoft Studio,我试图通过向表传递自定义数据源来填充表。 我创建了一个简单的报告,上面有一个表。报表本身从ms sql数据库获取数据。我已经编写了一个类似于本文中的类的java类。但我在表中没有任何价值。在这个示例中,没有scriptlet。我已经检查了(字符串)this.getFieldValue(“KN_FormelGG”)代码行。它从字段中获取数据,并可以在报告中显示。所以我猜bean数据源没有被填充。我在afterGroupInit中调用fill Table方法。如何在jasper中使用从java收集的

我试图通过向表传递自定义数据源来填充表。 我创建了一个简单的报告,上面有一个表。报表本身从ms sql数据库获取数据。我已经编写了一个类似于本文中的类的java类。但我在表中没有任何价值。在这个示例中,没有scriptlet。我已经检查了
(字符串)this.getFieldValue(“KN_FormelGG”)代码行。它从字段中获取数据,并可以在报告中显示。所以我猜bean数据源没有被填充。我在
afterGroupInit
中调用fill Table方法。如何在jasper中使用从java收集的数据?我还尝试在数据集和查询对话框中添加JavaBean,但也没有帮助。我应该将scriptlet添加到子报表/表中吗?我的问题的主要重点是在scriptlet中包含自定义数据源。我通过了考试,但仍然没有得到答案。我添加了
$P{FieldDataSource}.getData()
来检查数据,但它提供空值

java类1:

package testProjektIman.scriptlets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class FillTable extends JRDefaultScriptlet {

    @Override
public void afterGroupInit(final String id)
        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 Map<String, Object> fillTable()
        throws JRScriptletException {
    String kNFormelGG = null;
    kNFormelGG = (String) this.getFieldValue("KN_FormelGG");
    List<TableCells> listTableCells = new ArrayList<>();
    TableCells tableCell;
    for (String fn : splitGGArray(kNFormelGG)) {
        tableCell = new TableCells();
        tableCell.setFieldName(fn);
        listTableCells.add(tableCell);
    }
    JRBeanCollectionDataSource tableCellJRBean = new JRBeanCollectionDataSource(listTableCells);
    Map<String, Object> parameters = new HashMap<>();
    parameters.put("FieldDataSource", tableCellJRBean);
    return parameters;
}

}
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="tableAutoFill" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="37fc3a9c-38e9-41be-9039-56249c5283d7">
    <subDataset name="TableDataSource" uuid="5999e646-aeec-4b2b-b29b-68e897d56999">
        <queryString>
            <![CDATA[]]>
        </queryString>
        <field name="fieldName" class="java.lang.String"/>
    </subDataset>
    <scriptlet name="Filltable" class="testProjektIman.scriptlets.FillTable"/>
    <parameter name="FieldDataSource" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource" isForPrompting="false"/>
    <queryString>
        <![CDATA[select * from "KennzahlReferenz2015_QIBericht",  "Images" 
where LB_ID =  62
and KN_OffiziellGruppe =  3
and  IMG_ID = 1]]>
    </queryString>
    <field name="KN_Id" class="java.lang.Integer"/>
    <field name="KN_FormelZ" class="java.lang.String"/>
    <field name="KN_FormelGG" class="java.lang.String"/>
    <group name="id">
        <groupExpression><![CDATA[$F{KN_Id}]]></groupExpression>
        <groupHeader>
            <band height="50"/>
        </groupHeader>
        <groupFooter>
            <band height="50"/>
        </groupFooter>
    </group>
    <detail>
        <band height="191" splitType="Stretch">
            <componentElement>
                <reportElement x="50" y="18" width="260" height="120" uuid="942ab836-df83-4a2f-8215-845073ad163f">
                    <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"/>
                </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="TableDataSource" uuid="b554ada5-c388-4534-af8e-93571a417adb">
                        <parametersMapExpression><![CDATA[$P{FieldDataSource}]]></parametersMapExpression>
                        <dataSourceExpression><![CDATA[$P{FieldDataSource}]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="100" uuid="f57e4e8e-8a2e-405f-b9ab-7a704e0986fd">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:columnHeader style="Table_CH" height="30">
                            <staticText>
                                <reportElement x="0" y="0" width="100" height="30" uuid="9a55dd73-71e3-4559-9a8b-17d98bf17753"/>
                                <textElement>
                                    <font isBold="true"/>
                                </textElement>
                                <text><![CDATA[FieldName]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="100" height="30" uuid="c3e6ccfc-9f91-4d7a-800a-613f5dded928"/>
                                <textFieldExpression><![CDATA[$F{fieldName}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </detail>
</jasperReport>

数据适配器 通过用户界面创建数据适配器文件,例如
adapter.xml
。内容可能类似于:


你们班
com.yourcompany.jasper.JRDataSourceFactory
createCollection
假的
数据类 按照上面的数据适配器定义,创建一个具有
createCollection
方法的类:

package com.compay.jasper;
公共类JRDataSourceFactory{
/**
*@返回报表的数据集合。
*/
公共静态集合createCollection(){
返回Arrays.asList(newyourclass());
}
}
设置报表属性 确保报表具有以下属性(将报表链接到自定义数据适配器):


设置报告字段 报告字段现在应该能够引用bean属性:


重要的是,
fieldDescription
元素包含一个反映bean属性的值(即,您通常调用的Java代码,用于从该bean实例上的bean检索该值)

应用
JRDataSourceFactory
类是独立的——数据适配器使用它来创建bean实例的集合。
static
方法(
createCollection
)在这里完成工作,并且不使用继承

例子 如果可能,从bean的属性中借用报告的字段名。问题中所写的代码很难辨别
KN_Id
的值来自何处

以下示例将数据适配器链接到报表中的字段名

豆类 bean公开了一些属性:

package com.company.domain;
公共期末班学生扩展实体{
私有字符串名;
私有字符串lastName;
公共字符串getFirstName(){
返回这个.firstName;
}
公共字符串getLastName(){
返回this.lastName;
}
}
数据适配器 数据适配器如下所示:


学生
com.company.jasper.JRDataSourceFactory
createCollection
假的
数据类 数据类创建bean的实例:

package com.compay.jasper;
导入com.company.domain.Student;
公共类JRDataSourceFactory{
公共静态集合createCollection(){
返回Arrays.asList(newstudent());
}
}
报告字段 报告字段反映了bean字段:


一组“学生”实例被传递到报表中。在本例中,集合包含一个实例。在您的示例中,集合可能包含许多实例。当报表库在集合上迭代时,
firstName
lastName
的不同值将可用

学生
实例数据的初始填充机制不在本答案的范围之内。就报告工具而言,它只是使用预先填充的
Student
实例。如果
FillTable
填充
TableCells
,则报告工具不必担心这一问题。

可能会重复
<?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="tableAutoFill" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="37fc3a9c-38e9-41be-9039-56249c5283d7">
    <subDataset name="TableDataSource" uuid="5999e646-aeec-4b2b-b29b-68e897d56999">
        <queryString>
            <![CDATA[]]>
        </queryString>
        <field name="fieldName" class="java.lang.String"/>
    </subDataset>
    <scriptlet name="Filltable" class="testProjektIman.scriptlets.FillTable"/>
    <parameter name="FieldDataSource" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource" isForPrompting="false"/>
    <queryString>
        <![CDATA[select * from "KennzahlReferenz2015_QIBericht",  "Images" 
where LB_ID =  62
and KN_OffiziellGruppe =  3
and  IMG_ID = 1]]>
    </queryString>
    <field name="KN_Id" class="java.lang.Integer"/>
    <field name="KN_FormelZ" class="java.lang.String"/>
    <field name="KN_FormelGG" class="java.lang.String"/>
    <group name="id">
        <groupExpression><![CDATA[$F{KN_Id}]]></groupExpression>
        <groupHeader>
            <band height="50"/>
        </groupHeader>
        <groupFooter>
            <band height="50"/>
        </groupFooter>
    </group>
    <detail>
        <band height="191" splitType="Stretch">
            <componentElement>
                <reportElement x="50" y="18" width="260" height="120" uuid="942ab836-df83-4a2f-8215-845073ad163f">
                    <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"/>
                </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="TableDataSource" uuid="b554ada5-c388-4534-af8e-93571a417adb">
                        <parametersMapExpression><![CDATA[$P{FieldDataSource}]]></parametersMapExpression>
                        <dataSourceExpression><![CDATA[$P{FieldDataSource}]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="100" uuid="f57e4e8e-8a2e-405f-b9ab-7a704e0986fd">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:columnHeader style="Table_CH" height="30">
                            <staticText>
                                <reportElement x="0" y="0" width="100" height="30" uuid="9a55dd73-71e3-4559-9a8b-17d98bf17753"/>
                                <textElement>
                                    <font isBold="true"/>
                                </textElement>
                                <text><![CDATA[FieldName]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="100" height="30" uuid="c3e6ccfc-9f91-4d7a-800a-613f5dded928"/>
                                <textFieldExpression><![CDATA[$F{fieldName}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </detail>
</jasperReport>