ZetCode

JasperReports JRViewer

最后修改日期:2024 年 2 月 12 日

在本文中,我们将展示如何使用 JRViewer 组件显示使用 JasperReports 库创建的报表。

JasperReports 是一个开源报告库。它可以创建各种格式的报表,包括 PDF、HTML、XLS 或 CSV。 JRViewer 是一个用于 Swing 应用程序的组件,用于查看 JasperReports 生成的报表。

以下应用程序从 bean 集合数据源加载数据,并使用 JasperReports 库从中创建报表。在 JRViewer 组件的帮助下,报表将在小型 Swing 应用程序中显示。

report.xml
<?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,因此该文本字段会计算七次。

report.gvy
@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 模板文件编译成一个 JasperReportJasperReport 是一个已编译的模板,可以填充数据。

def jrPrint = JasperFillManager.fillReport(jreport, params, ds)

使用 JasperFillManager.fillReport 方法,我们创建一个 JasperPrint 对象;一个可以查看、打印或导出为其他格式的对象。

def viewer = new JRViewer(jrPrint)

我们将生成的 JasperPrint 传递给 JRViewer

frame.add(viewer)

JRViewer 被添加到 frame 中。

Countries
图:国家/地区

屏幕截图显示了 Jasper 查看器显示报表。

在本文中,我们使用 JasperReports 库创建了一个报表,并在 Swing 应用程序中使用 JRViewer 显示了它。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 JasperReports 教程