如何创建从Java调用的深入报表?

时间:2017-06-11 17:38:09

标签: java swing jasper-reports drilldown

我使用Jaspersoft Studio创建了Balances报告。我还在此报告中的字段上创建了超链接,其中包含以下属性:

Link Type: ReportExecution
Parameters: _report

上述参数的值为" GLLedger"这是同一个文件夹中的另一个碧玉报告。

在Java中,当我调用此报告并单击超链接时,GLLedger报告不会出现,但会在控制台上显示以下警告:

  

ReportExecution类型的超链接
  实现自己的JRHyperlinkListener来管理这种类型的事件。

在Java中,我使用JasperViewer来预览报告。以下是代码:

JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, hm, connection);
JasperViewer v = new JasperViewer(jasperPrint, false);
v.setVisible(true);

请您指导如何从一份碧玉报告中拨打另一份报告?

1 个答案:

答案 0 :(得分:3)

如果您想在swing应用程序中使用它,那么您的主要问题(至少在jasper报告版本< 6.1.1中)是您没有直接的方法来添加JRHyperLinkListener

来自JRViewer的源代码:

  

// FIXME添加一个方法来执行addHyperlinkListener而不进行子类化        protected JRViewerPanel createViewerPanel(){return new JRViewerPanel(viewerContext);}

我将向您展示如何对此类进行子类化,实现JRHyperlinkListener并打开一个新的框架,其中包含从链接收到的报告名称。

Java代码

创建一个扩展net.sf.jasperreports.swing.JRViewer并实现net.sf.jasperreports.view.JRHyperlinkListener的类,我添加了导入,因为库具有相同名称的旧类,

import java.awt.BorderLayout;
import java.util.HashMap;
import javax.swing.JFrame;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRPrintHyperlink;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.swing.JRViewer;
import net.sf.jasperreports.swing.JRViewerPanel;
import net.sf.jasperreports.view.JRHyperlinkListener;

public class HyperLinkTest extends JRViewer implements JRHyperlinkListener {

    private static final long serialVersionUID = -6429615130889276357L;

    public HyperLinkTest(JasperPrint jrPrint){
        super(jrPrint);
    }

    /**
     * Since JRViewerPanel is protected our only way to add listener is
     * to Override
     */
    @Override
    protected JRViewerPanel createViewerPanel()
    {
        JRViewerPanel panel =  new JRViewerPanel(viewerContext);
        panel.addHyperlinkListener(this);
        return panel;
    }

    /**
     * The listener gets the hyperlink reference and open relative report
     */
    @Override
    public void gotoHyperlink(JRPrintHyperlink arg) throws JRException {
        JasperReport report = JasperCompileManager.compileReport("jasper/" + arg.getHyperlinkReference() + ".jrxml");
        JasperPrint jasperPrint = JasperFillManager.fillReport(report, new HashMap<String, Object>());
        HyperLinkTest nextReport = new HyperLinkTest(jasperPrint);
        openReport("Navigated to", JFrame.DISPOSE_ON_CLOSE, nextReport);        
    }

    /**
     * static method that creates a frame and adds the JRViewer to it and 
     * open a new frame with the viewer
     */
    public static void openReport(String title, int defaultCloseOperation, JRViewer hyperLinkReport){
      SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            JFrame frame = new JFrame(title);
            frame.setDefaultCloseOperation(defaultCloseOperation);
            frame.getContentPane().setLayout(new BorderLayout());
            frame.getContentPane().add(hyperLinkReport,BorderLayout.CENTER);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
      });
    }

    /**
     *  Main method to test
     */
    public static void main(String[] args) throws JRException {
        JasperReport report = JasperCompileManager.compileReport("jasper/hyperlink1.jrxml");
        JasperPrint jasperPrint = JasperFillManager.fillReport(report, new HashMap<String, Object>());
        HyperLinkTest test = new HyperLinkTest(jasperPrint);
        openReport("Test hyperlink", JFrame.EXIT_ON_CLOSE, test);

    }   

}

Jrxml(报告)

在代码中可以看到我使用hyperlinkType="ReportExecution"并在hyperlinkReferenceExpression中传递下一个报告的名称。

报告1(hyperlink1.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="hyperlink1" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="601103bc-66ab-45a5-8422-ccb6f3e02ec2">
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="50">
            <textField hyperlinkType="ReportExecution">
                <reportElement x="0" y="0" width="100" height="20" uuid="8dc8f664-60b3-4b10-8a55-23120bea1f85"/>
                <textElement>
                    <font size="14" isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA["Hello"]]></textFieldExpression>
                <hyperlinkReferenceExpression><![CDATA["hyperlink2"]]></hyperlinkReferenceExpression>
            </textField>
        </band>
    </title>
</jasperReport>

报告2(hyperlink2.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="hyperlink1" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="601103bc-66ab-45a5-8422-ccb6f3e02ec2">
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="50">
            <textField hyperlinkType="ReportExecution">
                <reportElement x="113" y="0" width="100" height="20" uuid="8dc8f664-60b3-4b10-8a55-23120bea1f85"/>
                <textElement>
                    <font size="14" isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA["World"]]></textFieldExpression>
                <anchorNameExpression><![CDATA["World"]]></anchorNameExpression>
                <hyperlinkReferenceExpression><![CDATA["hyperlink1"]]></hyperlinkReferenceExpression>
            </textField>
        </band>
    </title>
</jasperReport>

结果

第一个窗口将打开&#34; Hello&#34; ,如果您点击&#34; Hello&#34; ,第二个窗口将打开&#34;世界&#34;

Output

  

注意:如果我做了这个应用程序,可能我会将所有.jrxml预编译为.jasper,因此避免在运行时编译,可能我会使用多个类(1代表框架,1代表观察者)避免使用静态方法,但我已经简化为更好地适应SO格式,专注于展示如何在Swing应用程序中实现JRHyperLinkListener

如何传递报告参数和其他数据

  

请告诉我如何将连接对象和其他参数从第一个报告传递到第二个comment

要将对象(字段,参数,变量或任何其他表达式)传递给jrxml中应该JRHyperlinkListener的{​​{1}}。

示例(请参阅hyperlinkParameter及其hyperlinkParameter

hyperlinkParameterExpression

<?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="hyperlink1" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="601103bc-66ab-45a5-8422-ccb6f3e02ec2"> <parameter name="reportDate" class="java.util.Date" isForPrompting="false"> <defaultValueExpression><![CDATA[new java.util.Date()]]></defaultValueExpression> </parameter> .... <textField hyperlinkType="ReportExecution"> <reportElement x="0" y="0" width="100" height="20" uuid="8dc8f664-60b3-4b10-8a55-23120bea1f85"/> <textElement> <font size="14" isBold="true"/> </textElement> <textFieldExpression><![CDATA["Hello"]]></textFieldExpression> <hyperlinkReferenceExpression><![CDATA["hyperlink2"]]></hyperlinkReferenceExpression> <hyperlinkParameter name="reportTime"> <hyperlinkParameterExpression><![CDATA[$P{reportDate}]]></hyperlinkParameterExpression> </hyperlinkParameter> </textField> .... </jasperReport> 现在可以访问此参数,例如我将其传递给参数地图以获取下一个报告,JRHyperlinkListener自然会继续为jphlp.getValue()

instanceof java.util.Date
  

注意:注意传递主报告数据源(这将在   结束,你不能重复使用它,如果你不先倒回它)和   连接(可能已关闭),最好将新连接传递给下一个报告。