JasperReports JRViewer
最后修改日期:2024 年 2 月 12 日
在本文中,我们将展示如何使用 JRViewer 组件显示使用 JasperReports 库创建的报表。
JasperReports 是一个开源报告库。它可以创建各种格式的报表,包括 PDF、HTML、XLS 或 CSV。 JRViewer 是一个用于 Swing 应用程序的组件,用于查看 JasperReports 生成的报表。
以下应用程序从 bean 集合数据源加载数据,并使用 JasperReports 库从中创建报表。在 JRViewer 组件的帮助下,报表将在小型 Swing 应用程序中显示。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<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="report.xml" pageWidth="595" pageHeight="842"
columnWidth="555" leftMargin="20" rightMargin="20"
topMargin="20" bottomMargin="20">
<style name="boldtext" isBold="true"/>
<style name="background1" mode="Opaque" backcolor="#8DCCE0"/>
<style name="background2" mode="Opaque" backcolor="#E5ECF9"/>
<field name="name"/>
<field name="population" class="java.lang.Long"/>
<columnHeader>
<band height="20">
<staticText>
<reportElement x="0" y="3" width="300" height="15" style="background1"/>
<box>
<bottomPen lineWidth="1.0" lineColor="#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]></text>
</staticText>
<staticText>
<reportElement x="15" y="5" width="130" height="15" style="boldtext"/>
<textElement textAlignment="Left"/>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x="150" y="5" width="130" height="15" style="boldtext"/>
<textElement textAlignment="Right"/>
<text><![CDATA[Population]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="15">
<staticText>
<reportElement x="0" y="0" width="300" height="14" style="background2"/>
<box>
<bottomPen lineWidth="0.5" lineColor="#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]></text>
</staticText>
<textField>
<reportElement x="15" y="0" width="130" height="15"/>
<textElement textAlignment="Left" verticalAlignment="Middle"/>
<textFieldExpression>
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="150" y="0" width="130" height="15"/>
<textElement textAlignment="Right" verticalAlignment="Middle"/>
<textFieldExpression class="java.lang.Long">
<![CDATA[$F{population}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
这是报表模板文件。模板包含两个区域:columnHeader 和 detail。
<style name="boldtext" isBold="true"/> <style name="background1" mode="Opaque" backcolor="#8DCCE0"/> <style name="background2" mode="Opaque" backcolor="#E5ECF9"/>
模板中使用了三种样式。样式可以创建模块化并减少代码重复。
<field name="name"/> <field name="population" class="java.lang.Integer"/>
模板中有两个字段。字段映射到数据源的元素。在我们的例子中,字段映射到 bean 的属性。(我们正在使用 JRBeanCollectionDataSource。)
<staticText>
<reportElement x="15" y="5" width="130" height="15" style="boldtext"/>
<textElement textAlignment="Left"/>
<text><![CDATA[Country]]></text>
</staticText>
<staticText> 用于在报表中显示标签。此静态文本显示列标题。
<textField>
<reportElement x="15" y="0" width="130" height="15"/>
<textElement textAlignment="Left" verticalAlignment="Middle"/>
<textFieldExpression>
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
文本字段是一个包含关联表达式的元素,该表达式在数据源的每次迭代中进行计算,以获取要显示的文本内容。此文本字段显示国家/地区名称。详细区域中的文本字段会针对数据源中的每个记录进行计算。由于我们的 JRBeanCollectionDataSource 中有七个 bean,因此该文本字段会计算七次。
@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')
import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.swing.JRViewer
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
import javax.swing.JFrame
import java.awt.EventQueue
import java.util.ArrayList
import java.awt.EventQueue
import java.awt.Dimension
import groovy.transform.Immutable
@Immutable
class Country {
String name;
Long population;
}
def countries = [
new Country('China', 1_382_050_000),
new Country('India', 1_313_210_000),
new Country('USA', 324_666_000),
new Country('Indonesia', 260_581_000),
new Country('Brazil', 207_221_000),
new Country('Pakistan', 196_626_000),
new Country('Nigeria', 186_988_000)
]
def ds = new JRBeanCollectionDataSource(countries)
def xmlFile = 'report.xml'
def jreport = JasperCompileManager.compileReport(xmlFile)
def params = [:]
def jrPrint = JasperFillManager.fillReport(jreport, params, ds)
EventQueue.invokeLater(() -> {
def frame = new JFrame('Jasper report');
def viewer = new JRViewer(jrPrint)
frame.add(viewer)
frame.setSize(new Dimension(750, 650))
frame.setLocationRelativeTo(null)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setVisible(true)
})
该示例生成报表并在 Jasper 查看器中显示它。
def ds = new JRBeanCollectionDataSource(countries)
JRBeanCollectionDataSource 是一个数据源实现,它包装了一个 Java bean 对象集合。我们将七个 Country bean 放入数据源。
def xmlFile = 'report.xml' def jreport = JasperCompileManager.compileReport(xmlFile)
我们将 XML 模板文件编译成一个 JasperReport。JasperReport 是一个已编译的模板,可以填充数据。
def jrPrint = JasperFillManager.fillReport(jreport, params, ds)
使用 JasperFillManager.fillReport 方法,我们创建一个 JasperPrint 对象;一个可以查看、打印或导出为其他格式的对象。
def viewer = new JRViewer(jrPrint)
我们将生成的 JasperPrint 传递给 JRViewer。
frame.add(viewer)
JRViewer 被添加到 frame 中。
屏幕截图显示了 Jasper 查看器显示报表。
在本文中,我们使用 JasperReports 库创建了一个报表,并在 Swing 应用程序中使用 JRViewer 显示了它。