java - 在报告中重复使用相同的字段结构/设计

标签 java jasper-reports

我需要设计一个报告来表示如下所示的 pojo 结构:

class Obj{
    field1;
    field2;

    List<Obj> substitutions;
}

我的报告将具有相同的字段设计,在详细信息 1 频段中使用一次,然后在详细信息 2 中使用子报告 n 次。

如何在细节 1 和 2 中重复使用相同的字段设计?

我尝试在detail1 中放置一个子报表,在detail 2 中放置一个子报表,指向相同的jrxml 文件。虽然第二个报告没问题,因为它是由报告后面对象中的集合填充的,但我不知道如何将当前报告数据源传递给第一个子报告。

有人有什么想法吗?

这里是结果报告的示例。

enter image description here

最佳答案

我有一个名为purchase的pojo类。

public class Purchase {
private String name;
private String remark;
 public void setName(String name) {
    this.name = name;
}
 public String getName() {
    return name;
}
public void setRemark(String remark) {
    this.remark = remark;
}
public String getRemark() {
    return remark;
}
}

生成pdf文件的主类。

public class JasperReportIntro {
public static void main(String[] args) {
    JasperReport jasperReport;
    JasperPrint jasperPrint;
    ArrayList<Purchase> list1 = new ArrayList<Purchase>();
    ArrayList<Purchase> list2 = new ArrayList<Purchase>();
    for(int i=0;i<20;i++) {
        Purchase purchase = new Purchase();
        purchase.setName("Vivek" + i);
        purchase.setRemark("This is remark" + i);
        purchase.setDiscount(10.0);
        purchase.setId(i);
        list1.add(purchase);
    }
    for(int i=0;i<20;i++) {
        Purchase purchase = new Purchase();
        purchase.setName("yadav" + i);
        purchase.setRemark("This is remark" + i);
        purchase.setDiscount(10.0);
        purchase.setId(i);
        list2.add(purchase);
    }

    try {
        jasperReport = JasperCompileManager.compileReport("path/to/report.jrxml");

        Map<String, List> result = new HashMap<String, List>();

        JRDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(list1);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("dataForSubreport1",list1);
        map.put("dataForSubreport2",list2);
        jasperPrint = JasperFillManager.fillReport(jasperReport,map, beanCollectionDataSource);
        JasperExportManager.exportReportToPdfFile(jasperPrint,
                "path/to/simple_report.pdf");
        System.out.println("Completed");
    } catch (JRException e) {
        e.printStackTrace();
    }
}
}

主报表类report.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="report" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4ddfa540-9b62-4339-9334-18733f7469cc">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["/home/jft/code/jasper-report/Genratedreports/"]]></defaultValueExpression>
</parameter>
<parameter name="dataForSubreport1" class="java.util.List"/>
<parameter name="dataForSubreport2" class="java.util.List"/>
<background>
    <band splitType="Stretch"/>
</background>
<title>
    <band height="100">
        <subreport>
            <reportElement x="0" y="20" width="555" height="40" uuid="8798ed7b-f389-4037-9381-3862d2f3e43a"/>
            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{dataForSubreport1})]]></dataSourceExpression>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "sub1.jasper"]]></subreportExpression>
        </subreport>
        <subreport>
            <reportElement positionType="Float" x="0" y="60" width="555" height="40" uuid="f99fdb31-afc3-4127-8148-8e0426cd71a6"/>
            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{dataForSubreport2})]]></dataSourceExpression>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "sub1.jasper"]]></subreportExpression>
        </subreport>
    </band>
</title>
</jasperReport>

这是子报表 sub1.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="sub1" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="48bc0742-6980-42a7-9a52-6f125fb83bc2">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<field name="name" class="java.lang.String"/>
<background>
    <band splitType="Stretch"/>
</background>
<detail>
    <band height="20" splitType="Stretch">
        <textField>
            <reportElement x="0" y="0" width="100" height="20" uuid="ac3c1a86-6d0d-4b63-b339-744528573666"/>
            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
        </textField>
    </band>
</detail>
</jasperReport>

使用jasperreportintro的主类下载文件。我使用map传递了两个参数dataForSubreport1和dataForSubreport2。并在子报告中发送两个参数。它使用具有不同 -2 值的相同子报表。希望对您有帮助。

享受吧。

关于java - 在报告中重复使用相同的字段结构/设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23657690/

相关文章:

java - 没有字段的类是否有特殊名称?

java - Jasper Report 在 Excel 文件中多次打印同一份报告

java - 主报告未填写,但子报告已填写

java - 如何排除 Ivy 中的工件

java - 如何从 Java 应用程序调用 GraphQL 端点

java - 从 Spinner 中删除 DropDownViewResource - java Android Studio

java - .Net 相当于 Java 的 System.identityHashCode()

java-jar文件不直接在windows中运行,而是通过命令提示符运行

excel - 如何在Excel生成Jasper报告中添加VBA Excel脚本?

java - 使用jasper生成word格式的报告