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
显示了它。