【问题标题】:How to print several reports with barcode \ or several barcodes in one report如何在一份报告中打印多个带有条形码的报告或多个条形码
【发布时间】:2012-09-19 08:19:11
【问题描述】:

我有一个 barcode 报告,它使用序列(Oracle 后端)来生成我的 barcode 编号。

这是我的查询:

SELECT to_char(PALLET_ID_NO_SEQ.nextval) FROM dual

我将此字段放置在将显示 barcode 值的设计器窗口中。

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

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

以上是条码使用序列值。

我希望能够打印/生成 100 个或更多报告。目前,我一次只能生成一份报告。

所以我的第一个猜测是获取一个参数,该参数会提示用户一个值,该值将指示要打印多少个条形码,每个条形码都有一个单独的编号。

我不确定我关于解决这个问题的想法是否正确以及如何去做。

有人可以帮忙吗?

【问题讨论】:

  • 据我了解,没有办法生成交互式 Jasper 报告(至少对于桌面)。因此,您需要先询问用户所需条形码的数量,然后生成报告。
  • @AndreiPodoprigora 对,假设我想从我已经创建的报告中生成 100 个报告。我该怎么做?

标签: java oracle jasper-reports


【解决方案1】:

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

解决方案 1. 在 Detail 带中使用带有 Barcode 组件的单个报告

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

在这种情况下,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):


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

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

条码组件的表达式为:

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

解决方案 2. 使用组头带

您可以使用与第一个解决方案中相同的 queryString 表达式。 rownum 字段上的组将帮助我们生成 single 报告,其中包含许多属于其自己组的条形码(一组 - 一个条形码)。 Barcode 组件应放置在 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>

如果 isStartNewPage="false"rownumGroup 的结果将是 ($P{quantity} == 7):

如果 isStartNewPage="true"rownumGroup 的结果将是 ($P{quantity} == 5):

解决方案 3. 使用子报表

我们可以将 Subreport 组件添加到 Detail 带(参见第一个解决方案)或 Group Header(见第二个解决方案)乐队。在这种情况下,您不仅可以向子报表添加 Barcode 组件,还可以添加您想要的所有内容。

【讨论】:

  • 投反对票的原因是什么?这是一个有效的、经过测试的样本。
  • @wernervdh8 我刚刚添加了其他几个解决方案
  • 也许答案的长度与开场白“可以轻松完成”相结合?我投票给你。
  • @JasonSperske 这不是特洛伊木马))
  • @AlexK 谢谢亚历克斯。看起来真的很有希望。我会尽快测试并告诉你结果是什么
【解决方案2】:

一种可能的方式:

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 个此类 bean(您的条形码图像)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多