总体思路就是先生成二维码的图片,然后再把二维码的图片信息传递给iReport的图片组件让其显示出来。
1、新建模板
2、在Detail模块放置一个list组件,list组件下放置一个image组件及text field组件
3、 这时候就会自动生成一个dataset1(或者别的名字)这个就是list组件的数据源
4、我们先在模板Parameters这右键新建一个变量dataList,这个就是我们传递给模板数据源的变量名,因为我们传递的是一个列表,所以变量名的类名选java.util.Collection
5、有了列表的变量,那列表中每一行都还有不同的字段显示值,这时候我们需要在dataset1中定义我们每一行都有哪些字段值
6、在dataset1的Fields中定义我们每一行的字段名叫什么,这里我们定义两个字段,一个字段叫barcodeImageStr(用来放置经过base64编码的图片信息)一个叫barcodeStr(用来放置二维码的一些辅助信息),两个都是string类型
7、接下来我们绑定下这写信息到我们的列表list组件中,右键Detail 1中的list组件,选择【Edit list datasource】,弹出来的窗口这我们确认下【Sub dataset】是不是选中了我们前面配置了行详情的数据集dataset1,然后选择【Connection/Datasource exp】编辑绑定我们的变量,因为我们这是一个列表,所以我们要选【JRBeanCollectionDataSource】默认是写这个【new net.sf.jasperreports.engine.JREmptyDataSource(1)】这我们需要修改成new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{dataList})
//注意不是JREmptyDataSource 而是JRBeanCollectionDataSource
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{dataList})
其中$P{dataList}就是我们前面设置的列表变量名,你可用在括号里面定位光标,然后在下面的Parameters中找到这个变量,双击该变量就会自动把变量填写到上面
8、数据源绑定后我们修改image组件及text field组件绑定的字段名,因为我们选择的是先生成二维码图片,然后再把图片信息传递给模板,让模板展示出二维码信息,所以这里我们需要再image组件这的【Image Expression】这输入赋值的表达式【new ByteArrayInputStream(com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode($F{barcodeImageStr}))】然后在下面的【Expression Class】这选择【java.io.InputStream】,因为二维码下面的文字就普通的字符串信息,所以我们就设置为string类型就好了
new ByteArrayInputStream(com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode($F{barcodeImageStr}))
9、传入数据预览即可得到如下图所示内容
注意: 传递图片信息的时候忽略前面的【data:image/png;base64,】
不需要指明图片类型等信息