没有显示的子报告细节带

时间:2012-10-23 06:09:45

标签: java jasper-reports ireport

我的主报告包含5个字段,其中4个字段的类型为 java.lang.String ,最后一个字段的类型为 java。 util.List 即可。我使用后者作为子报告的数据源。我设置子报告数据源

子报告属性:

连接类型 使用数据源表达式
数据源表达式 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($ F {Field5})

传递数据工作正常(我猜)因为当我在 Java 应用程序中填写报表时。我可以查看传递到字段1到4但在字段5中的数据,首先,我无法验证,因为子报表不显示数据,只有列中定义的静态文本头

然后当我将子报告的字段放在页脚中时,我发现数据传递成功,问题是详细信息乐队本身没有显示。

为什么不显示?

子报告属性中,我有:

没有数据时 所有部分,无详细信息

任何人都可以对此有所了解。

5 个答案:

答案 0 :(得分:11)

我有同样的问题超过1天。在我正在开发的应用程序中,有多个 JasperReports 可以工作。我在添加新问题时遇到了这个问题。无论我尝试什么, Detail 频段中都没有显示任何内容。我尝试了从填充报告的Controller三重检查到升级到最新jasperreports jar和最新iReports版本的所有内容。似乎没什么用。

问题是报告默认设置为:When No Data: All Sections, No Detail,这基本上意味着如果没有数据发送到报告,它将显示所有部分, Detail 一。

虽然我用来测试报告的静态文本除了直接从Java控制器传递参数外,在我向查询文本属性添加EXEC [myFunction] $P{parameterId}之后它才起作用报告。该函数是一个简单直接的函数,它从Java传递parameterId作为参数并返回一些东西。 (另外,请确保将数据集查询sql 属性的语言设置为 SQL )。

总而言之,由于某种原因,报告似乎没有将Java参数作为数据(因此它显示除 Detail 之外的所有部分),因此当我显式调用SQL时函数返回一些参数并将它们放入我的详细页面,它可以工作。

我希望这对你有所帮助,我把头埋了10个小时来解决这个问题。

答案 1 :(得分:1)

你可以尝试这个样本。

POJO (Bean):

public class BeanWithList {

    private List<String> m_cities;
    private Integer m_id;

    public BeanWithList(List<String> cities, Integer id) {
        m_cities = cities;
        m_id = id;
    }

    public List<String> getCities() {
        return m_cities;
    }

    public Integer getId() {
        return m_id;
    }
}

填写报告的代码:

public static void testBuildPdf() {
    try {

        Map<String, Object> params = new HashMap<String, Object>();

        params.put("BeanSubreport", JasperCompileManager.compileReport(subreportSource));

        JasperReport jasperReport = JasperCompileManager.compileReport(masterSource);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDataSource());

        JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static JRDataSource getDataSource() {
    Collection<BeanWithList> coll = new ArrayList<BeanWithList>();

    BeanWithList bean = new BeanWithList(Arrays.asList("London", "Paris"), 1);

    coll.add(bean);

    bean = new BeanWithList(Arrays.asList("London", "Madrid", "Moscow"), 2);
    coll.add(bean);

    bean = new BeanWithList(Arrays.asList("Rome"), 3);
    coll.add(bean);

    return new JRBeanCollectionDataSource(coll);
}

子报告 jrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport .. leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <field name="city" class="java.lang.String">
        <fieldDescription><![CDATA[_THIS]]></fieldDescription>
    </field>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement positionType="Float" x="0" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{city}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

主人 jrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
    <parameter name="BeanSubreport" class="net.sf.jasperreports.engine.JasperReport"/>
    <field name="id" class="java.lang.Integer"/>
    <field name="cities" class="java.util.Collection"/>
    <title>
        <band height="103" splitType="Stretch">
            <staticText>
                <reportElement x="138" y="28" width="258" height="20"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true"/>
                </textElement>
                <text><![CDATA[Bean with List sample]]></text>
            </staticText>
        </band>
    </title>
    <columnHeader>
        <band height="20">
            <staticText>
                <reportElement x="0" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Id]]></text>
            </staticText>
            <staticText>
                <reportElement x="100" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[City name]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement stretchType="RelativeToTallestObject" x="0" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <subreport>
                <reportElement positionType="Float" stretchType="RelativeToTallestObject" x="100" y="0" width="100" height="20" isPrintWhenDetailOverflows="true"/>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{cities})]]></dataSourceExpression>
                <subreportExpression><![CDATA[$P{BeanSubreport}]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

结果将是:

The report in PDF format


此示例的主要技巧是使用 _THIS “变量”。

有关详细信息,请参阅JavaBean Data Sources文章。

答案 2 :(得分:0)

我通过在运行时设置子报表参数来解决它。

对于遇到相同问题的人,我只是将JasperReport对象(数据类型为net.sf.jasperreports.engine.JasperReport)存储在java变量中,然后将该变量传递给报表中的参数。此参数设置为子报表表达式的值。子报表参数的表达式类应为net.sf.jasperreports.engine.JasperReport

答案 3 :(得分:0)

将参数传递给FillManager时,请不要使用null,请使用JREmptyDataSource。

正确的方式: JasperFillManager.fillReport(this.getReportTemplate(JASPER_REPORT_EXPIRY_LETTER),this.parameters,new JREmptyDataSource());

错误的方式: JasperFillManager.fillReport(this.getReportTemplate(JASPER_REPORT_EXPIRY_LETTER),this.parameters,null);

答案 4 :(得分:0)

import java.awt.Desktop;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.swing.JRViewer;
import net.sf.jasperreports.view.JasperViewer;

public class MyForm extends JFrame {



    public static JasperDesign jasperDesign;
    public static JasperPrint jasperPrint;
    public static JasperReport jasperReport;
    static JRBeanCollectionDataSource jrBeanCollectionDataSource;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                MyForm frame = new MyForm();
                frame.setVisible(true);
            }
        });
    }

    /**
     * Create the frame.
     */
    public MyForm() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 431, 286);
        setTitle("ThaiCreate.Com Java GUI Tutorial");
        getContentPane().setLayout(null);


        // Button Report
        JButton btnOpenReport = new JButton("Open Report");
        btnOpenReport.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                Connection connect = null;

                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    connect =  DriverManager.getConnection("jdbc:mysql://localhost:3306/test" ,"root","");
                    System.out.println("Connected....");
                }
                catch (ClassNotFoundException e1) 
                {e1.printStackTrace();} 
                catch (SQLException e) 
                {e.printStackTrace();}

                // Application path
                FileInputStream report = null;
                try {
                     FileInputStream input = new FileInputStream(new File("C:\\Users\\admin\\Desktop\\report1.jrxml"));
                      try 
                     {

                        jasperDesign = JRXmlLoader.load(input);
                        jasperReport = JasperCompileManager.compileReport(jasperDesign);
                        jasperPrint = JasperFillManager.fillReport(jasperReport, null, connect);
                        JasperExportManager.exportReportToPdfFile(jasperPrint, "E:\\demo.pdf");



//                      Desktop.getDesktop().open(new File("D:/ReceiptReport.pdf"));

                    } catch (JRException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 



                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                JFrame frame = new JFrame();
                frame.setTitle("ThaiCreate.Com Customer Report");
                frame.setBounds(100, 100, 800,600);
                frame.getContentPane().add(new JRViewer(jasperPrint));
                frame.setVisible(true);

                try {
                    connect.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });

        btnOpenReport.setBounds(137, 98, 146, 23);
        getContentPane().add(btnOpenReport);
        setResizable (false);
    }
}