我的主报告包含5个字段,其中4个字段的类型为 java.lang.String ,最后一个字段的类型为 java。 util.List 即可。我使用后者作为子报告的数据源。我设置子报告的数据源。
子报告属性:
连接类型: 使用数据源表达式
数据源表达式: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($ F {Field5})
传递数据工作正常(我猜)因为当我在 Java 应用程序中填写报表时。我可以查看传递到字段1到4但在字段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>
结果将是:
此示例的主要技巧是使用 _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);
}
}