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

我有一个条形码报告,它使用一个序列( 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个或更多报告。 此时我一次只能生成一个报告。

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

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

有人可以帮忙吗?

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

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

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

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

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

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

工作的rjxml文件:

           <band height="82" splitType="Stretch"> <textfield> <reportelement x="145" y="18" width="240" height="20"></reportelement> <textelement></textelement> <textfieldexpression><![CDATA["The number of barcodes is: " + $P{quantity}]]></textfieldexpression> </textfield> </band>             

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

通过iReport中的预览结果


在您的情况下, 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.使用Group Header band

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

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

rjxml文件:

                        <band height="82" splitType="Stretch"> <textfield> <reportelement x="145" y="18" width="240" height="20"></reportelement> <textelement></textelement> <textfieldexpression><![CDATA["The number of barcodes is: " + $P{quantity}]]></textfieldexpression> </textfield> </band>   

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

通过iReport中的预览结果,isStartNewPage =“false”

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

通过iReport中的预览结果,isStartNewPage =“true”

解决方案3.使用子报表

我们可以将Subreport组件添加到Detail band( 请参阅第一个解决方案 )或Group Header请参阅第二个解决方案 )band。 在这种情况下,您不仅可以向子报表添加条形码组件,还可以添加所需的所有内容。

一种可能的方式:

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)创建一个这样的jasper报告:

                          

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