如何在DynamicJasper中使用jrxml文件作为设计模板

时间:2014-07-31 04:14:36

标签: java jasper-reports dynamic-jasper

我正在使用 DynamicJasper 打印报告。到目前为止它是打印成一张桌子。但我想把它打印成支票。我已将检查模板设计创建为 jrxml 。我想传递表中填充的值以传递到相关的 jrxml 位置。

以下是打印表格的代码:

public class ReportPrint {

public static void print(Cheque cheque) throws JRException, IOException {
    try {
        DynamicReportBuilder dynamicReportBuilder = new DynamicReportBuilder();

        // configure report-level settings
        dynamicReportBuilder.setReportName("Cheque");

        dynamicReportBuilder.setPageSizeAndOrientation(Page.Page_Letter_Portrait());

        // add cheque number column to report
        ColumnBuilder columnBuilderID = ColumnBuilder.getNew();

        columnBuilderID.setTitle("Cheque Number");
        columnBuilderID.setWidth(100);
        columnBuilderID.setFixedWidth(true);
        columnBuilderID.setColumnProperty("chqNum", String.class.getName(), "chqNum");

        dynamicReportBuilder.addColumn(columnBuilderID.build());

     // add payee name column to report
        ColumnBuilder columnBuilderName = ColumnBuilder.getNew();

        columnBuilderName.setTitle("Payee Name");
        columnBuilderName.setWidth(120);
        columnBuilderName.setFixedWidth(true);
        columnBuilderName.setColumnProperty("name", String.class.getName(), "name");

        dynamicReportBuilder.addColumn(columnBuilderName.build());

        // add amount column to report
        ColumnBuilder columnBuilderAmount = ColumnBuilder.getNew();

        columnBuilderAmount.setTitle("Cheque Amount");
        columnBuilderAmount.setWidth(100);
        columnBuilderAmount.setFixedWidth(true);
        columnBuilderAmount.setColumnProperty("amount", Double.class.getName(), "amount");

        dynamicReportBuilder.addColumn(columnBuilderAmount.build());

        // add date column to report
        ColumnBuilder columnBuilderDate = ColumnBuilder.getNew();

        columnBuilderDate.setTitle("Cheque Date");
        columnBuilderDate.setWidth(100);
        columnBuilderDate.setFixedWidth(true);
        columnBuilderDate.setColumnProperty("date", Date.class.getName(), "date");

        dynamicReportBuilder.addColumn(columnBuilderDate.build());

        // add value in words column to report
        ColumnBuilder columnBuilderWordVal = ColumnBuilder.getNew();

        columnBuilderWordVal.setTitle("Cheque Amount in Words");
        columnBuilderWordVal.setWidth(150);
        columnBuilderWordVal.setFixedWidth(true);
        columnBuilderWordVal.setColumnProperty("value", String.class.getName(), "value");

        dynamicReportBuilder.addColumn(columnBuilderWordVal.build());

        DynamicReport dynamicReport = dynamicReportBuilder.build();

        //Creating data source 
        Collection<Cheque> reportCollection = new ArrayList<Cheque>();
        reportCollection.add(cheque);
        JRDataSource dataSource = new JRBeanCollectionDataSource( reportCollection  );


        // build JasperPrint instance, filling the report with data from data source created above
        JasperPrint jasperPrint = DynamicJasperHelper.generateJasperPrint(
            dynamicReport, new ClassicLayoutManager(), dataSource, new HashMap<String, Object>());

        // export to pdf                     
        String pdfFile = "Cheque.pdf";

        JRExporter exporter = new JRPdfExporter();

        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, pdfFile);

        exporter.exportReport();

        JasperPrintManager.printReport(jasperPrint, true);
    } catch(JRException e) {
        e.printStackTrace();
    }
}
 }

这是 jrxml 文件:

<?xml version="1.0" encoding="UTF-8"?>

<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString>
    <![CDATA[]]>
</queryString>
<field name="amount" class="java.lang.Double">
    <fieldDescription><![CDATA[amount]]></fieldDescription>
</field>
<field name="chqNum" class="java.lang.String">
    <fieldDescription><![CDATA[chqNum]]></fieldDescription>
</field>
<field name="date" class="java.sql.Date">
    <fieldDescription><![CDATA[date]]></fieldDescription>
</field>
<field name="name" class="java.lang.String">
    <fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<background>
    <band splitType="Stretch"/>
</background>
<detail>
    <band height="128" splitType="Stretch">
        <textField>
            <reportElement uuid="8cd5eac7-d03e-4085-b39f-b1f8d6596b97" x="339" y="101" width="138" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[$F{amount}]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement uuid="6c962fb1-7db6-47d5-9a3e-098f4603be1b" x="36" y="59" width="138" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement uuid="961a90da-700b-4e18-a9c6-8bc510dc92af" x="339" y="23" width="138" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[$F{date}]]></textFieldExpression>
        </textField>
        <staticText>
            <reportElement uuid="48026b8c-f4d0-464e-a3cc-3762316dca2a" stretchType="RelativeToBandHeight" x="19" y="93" width="288" height="35"/>
            <textElement>
                <paragraph lineSpacing="1_1_2" firstLineIndent="36"/>
            </textElement>
            <text><![CDATA[Four Thousand Seven Hundred and Twenty-Five Cents]]></text>
        </staticText>
    </band>
</detail>
</jasperReport>

1 个答案:

答案 0 :(得分:0)

万一有人在2018/2019年需要这个,这是食谱。

1º您拿下jrxml并按照:进行清理: http://dynamicjasper.com/2010/10/06/how-to-use-custom-jrxml-templates/

基本上需要:

  • 模板必须没有组,如果满足以下条件,DynamicJAsper将创建它们:

  • 详细信息栏必须为空:DynamicJasper将在详细信息中使用 带,则将删除任何先前存在的元素。

  • 每个页面的大小和方向都需要一个模板:这是
    因为DJ知道如何安排他创建的元素,但不知道
    现有的。

2º您调用setTemplateFile方法:

 public DynamicReportBuilder setTemplateFile(String path,
                                                         boolean importFields,
                                                         boolean importVariables,
                                                         boolean importParameters,
                                                         boolean importDatasets)

带有必需的布尔标志。这些布尔标志将允许您加载或不加载在jrxml上设置的参数,字段,变量和数据集。

在下面,我附上一个模拟示例。但是,您将需要自己的jrxml文件进行测试。

public class TestReport {

    protected static JasperPrint jp;
    protected static JasperReport jr;
    protected static Map params = new HashMap();
    protected static DynamicReport dr;

    public static void main(String args[]) throws SQLException, ColumnBuilderException, ClassNotFoundException {

        TestReport t = new TestReport();
        t.createReport();

    }

    public void createReport() throws SQLException, ColumnBuilderException, ClassNotFoundException {

        ArrayList<Fruit> createMockDataset = createMockDataset();

        Style titleStyle = new Style();
        titleStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        titleStyle.setFont(Font.ARIAL_SMALL_BOLD);

        Style dataStyle = new Style();
        dataStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        dataStyle.setFont(Font.ARIAL_SMALL);
        dataStyle.setBlankWhenNull(true);

        final List items = SortUtils.sortCollection(createMockDataset, Arrays.asList(new String[]{"name", "description"}));

        FastReportBuilder drb = new FastReportBuilder();
        drb.setTemplateFile("templatePortrait.jrxml", true, true, true, true);
        drb.addColumn("name", "name", String.class.getName(), 30, dataStyle)
                .addColumn("description", "description", String.class.getName(), 50, dataStyle)
                .setTitle("Report")
                .setSubtitle("")
                .setPrintBackgroundOnOddRows(true)
                .setUseFullPageWidth(true);



        DynamicReport dynamicReport = drb.build();

        dynamicReport.setTitleStyle(titleStyle);

        HashMap parametros = new HashMap();
        parametros.put("dataRelatorio", MyTools.getDataPorExtenso());

        doReport(dynamicReport, items, parametros);
    }

    public void doReport(final DynamicReport _report, final Collection _data, HashMap parametros) {
        try {
            JRDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(_data);

            JasperPrint jasperPrint = DynamicJasperHelper.generateJasperPrint(_report, new ClassicLayoutManager(), beanCollectionDataSource, parametros);

            JasperViewer.viewReport(jasperPrint);
        } catch (JRException ex) {
            ex.printStackTrace();
        }
    }


    public ArrayList<Fruit> createMockDataset() {
        ArrayList<Fruit> fruits = new ArrayList<>();

        Fruit f1 = new Fruit();
        f1.name = "Apple X1";
        f1.description = "Yummy yummy apple for the stackoverflow readers 1";

        Fruit f2 = new Fruit();
        f2.name = "Apple Ag";
        f2.description = "Yummy yummy apple for the stackoverflow readers 2";

        Fruit f3 = new Fruit();
        f3.name = "Apple Mn";
        f3.description = "Yummy yummy apple for the stackoverflow readers 3";

        Fruit f4 = new Fruit();
        f4.name = "Apple O2";
        f4.description = "Yummy yummy apple for the stackoverflow readers 4";

        //Evaluations for f1
        for (int i = 0; i < 4; i++) {
            Evaluation e = new Evaluation();
            e.id = i;
            e.score = Math.random() * 10;
            f1.evaluations.add(e);
        }

        //evaluations for f4
        for (int i = 0; i < 4; i++) {
            Evaluation e = new Evaluation();
            e.id = i;
            e.score = Math.random() * 10;
            f4.evaluations.add(e);
        }

        fruits.add(f1);
        fruits.add(f2);
        fruits.add(f3);
        fruits.add(f4);

        return fruits;

    }

    public class Fruit {

        public String name;
        public String description;
        public ArrayList<Evaluation> evaluations = new ArrayList<Evaluation>();

        public Fruit() {

        }

        public Fruit(String name, String description) {
            this.name = name;
            this.description = description;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public ArrayList<Evaluation> getEvaluations() {
            return evaluations;
        }

        public void setEvaluations(ArrayList<Evaluation> evaluations) {
            this.evaluations = evaluations;
        }

    }

    public class Evaluation {

        public int id;
        public double score;

        public Evaluation() {

        }

        public Evaluation(int id, double score) {
            this.id = id;
            this.score = score;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public double getScore() {
            return score;
        }

        public void setScore(double score) {
            this.score = score;
        }

    }

}