如何在一个报告中打印带有条形码或多个条形码的多个报告

时间:2012-09-19 08:19:12

标签: java oracle jasper-reports

我有一个条形码报告,该报告使用序列( Oracle 后端)生成我的条形码号码。

这是在我的查询中:

SELECT to_char(PALLET_ID_NO_SEQ.nextval) FROM dual

我将此字段放在设计器窗口中,该窗口将显示条形码值。

我有一张带有表情的图片:

new com.pepkorit.BarbecueRotateRenderer(
    net.sourceforge.barbecue.BarcodeFactory.createCode128C(
    $F{TO_CHAR(PALLET_ID_NO_SEQ.NEXTVAL)}), false, true, 1, 50, 190, 50)

以上是使用序列值的条形码

我希望能够说打印/生成100个或更多报告。此刻,我一次只能生成一个报告。

所以我的第一个猜测是获取一个参数,提示用户输入一个值,该值将指示要打印的条形码的数量,并且每个都有一个单独的数字。

我不确定我解决这个问题的想法是否正确以及如何做到这一点。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

只需对您的查询进行少量修改即可轻松完成,无需通过多种方式进行编程。

解决方案1.在详细信息带中使用单个报告和条形码组件

您可以使用单个报告的模板在一个报告中生成多个条形码。

在这种情况下, queryString 表达式(适用于 Oracle DB)将如下所示:

SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}

- 它会根据您的需要多次生成序列中的值。 $ P {quantity} 参数确定要生成的行数(条形码)。

正在运行的 rjxml 文件:

<jasperReport ...>
    <parameter name="quantity" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[20]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}]]>
    </queryString>
    <field name="BARCODE" class="java.lang.Integer"/>
    <field name="ROWNUM" class="java.lang.Integer"/>
    <title>
        <band height="82" splitType="Stretch">
            <textField>
                <reportElement x="145" y="18" width="240" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["The number of barcodes is: " + $P{quantity}]]></textFieldExpression>
            </textField>
        </band>
    </title>
    <detail>
        <band height="47" splitType="Stretch">
            <componentElement>
                <reportElement x="145" y="10" width="200" height="28"/>
                <jr:barbecue xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" type="2of7" drawText="false" checksumRequired="false">
                    <jr:codeExpression><![CDATA[$F{BARCODE}]]></jr:codeExpression>
                </jr:barbecue>
            </componentElement>
        </band>
    </detail>
</jasperReport>

结果将是( $ P {quantity} == 5 ):

The result via preview in iReport


在您的情况下, queryString 表达式将如下所示:

SELECT to_char(PALLET_ID_NO_SEQ.nextval) AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}

Barcode 组件的表达式为:

new com.pepkorit.BarbecueRotateRenderer(
    net.sourceforge.barbecue.BarcodeFactory.createCode128C($F{barcode}),
    false, true, 1, 50, 190, 50)

解决方案2.使用Group Header band

您可以使用与第一个解决方案相同的 queryString 表达式。 rownum 字段中的组将帮助我们生成单个报告,其中包含许多属于其自己组的条形码(一个组 - 一个条形码)。 条形码组件应放在 Group Header 区域。

使用 isStartNewPage 属性,我们可以设法在新网页上生成群组。

rjxml 文件:

<jasperReport ...>
    <parameter name="quantity" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[20]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}]]>
    </queryString>
    <field name="BARCODE" class="java.lang.Integer"/>
    <field name="ROWNUM" class="java.lang.Integer"/>
    <group name="rownumGroup" isStartNewPage="true">
        <groupExpression><![CDATA[$F{ROWNUM}]]></groupExpression>
        <groupHeader>
            <band height="50">
                <componentElement>
                    <reportElement x="145" y="11" width="200" height="28"/>
                    <jr:barbecue xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" type="2of7" drawText="false" checksumRequired="false">
                        <jr:codeExpression><![CDATA[$F{BARCODE}]]></jr:codeExpression>
                    </jr:barbecue>
                </componentElement>
            </band>
        </groupHeader>
    </group>
    <title>
        <band height="82" splitType="Stretch">
            <textField>
                <reportElement x="145" y="18" width="240" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["The number of barcodes is: " + $P{quantity}]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

如果组 rownumGroup isStartNewPage =“false” ,结果将是( $ P {quantity} == 7 ):

The result via preview in iReport, isStartNewPage="false"

如果组 rownumGroup isStartNewPage =“true” ,结果将是( $ P {quantity} == 5 ):

The result via preview in iReport, isStartNewPage="true"

解决方案3.使用子报告

我们可以将子报告组件添加到详细信息频段(参见第一个解决方案)或组标题(< em>看第二个解决方案)乐队。在这种情况下,您不仅可以将条形码组件添加到子报表中,还可以添加所需的所有内容。

答案 1 :(得分:0)

一种可能的方式:

1)创建一个bean:

public class Entity {
    private Image image;

    public Entity(Image image) {
        this.image = image;
    }

    public Entity() {}

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }
}

2)用数据(条形码图像)填充100个这样的豆子

3)创建一个像这样的碧玉报告:

<?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="ExtendedPortReport" language="groovy" pageWidth="1190" pageHeight="842" orientation="Landscape" columnWidth="1150" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="ireport.zoom" value="0.75"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <field name="image" class="java.awt.Image"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="750" splitType="Stretch">
            <image scaleImage="RetainShape" hAlign="Center" vAlign="Top" isUsingCache="true" onErrorType="Blank">
                <reportElement isPrintRepeatedValues="false" x="0" y="0" width="1150" height="750"/>
                <box>
                    <pen lineWidth="0.0"/>
                    <topPen lineWidth="0.0"/>
                    <leftPen lineWidth="0.0"/>
                    <bottomPen lineWidth="0.0"/>
                    <rightPen lineWidth="0.0"/>
                </box>
                <imageExpression><![CDATA[$F{image}]]></imageExpression>
            </image>
        </band>
    </detail>
</jasperReport>

4)将图像字段的类型(在报告中)设置为java.awt.Image

5)将报告创建为桌面应用程序(在您的情况下,如果需要,使用其他方式)

    final JasperReport report = (JasperReport)JRLoader.loadObjectFromFile(MAIN_BINARY_PATH);
    final JRDataSource dataSource = new JRBeanCollectionDataSource(/*there is your list of entities*/);

    final JasperPrint jasperPrint = JasperFillManager.fillReport(report, null, dataSource);
    JRViewer viewer = new JRViewer(jasperPrint);
    //add viewer to a frame/panel