7

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

子报表属性:

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

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

然后当我将子报表的字段放在Page Footer中时,我发现数据传递成功,问题是Detail带本身没有显示。

为什么不显示?

子报表属性中,我有:

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

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

4

5 回答 5

11

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

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

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

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

我希望这对您有所帮助,我花了 10 个小时才弄清楚这一点。

于 2012-10-25T09:18:33.273 回答
1

你可以试试这个样本。

POJO (豆):

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>

结果将是:

PDF格式的报告


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

有关更多信息,您可以阅读JavaBean 数据源文章。

于 2012-10-23T11:01:42.260 回答
0

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

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

于 2012-10-29T03:36:54.223 回答
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);

于 2013-05-21T08:41:08.610 回答
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);
    }
}
于 2015-02-18T06:45:15.060 回答