ZetCode

JasperReports ResourceBundle

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

在本文中,我们在 JasperReports 库中创建了一个多语言报表。示例的源代码可以在作者的 Github 仓库中找到。

JasperReports 是一个开源报告库。它可以创建各种格式的报告,包括 PDF、HTML、XLS 或 CSV。JasperReports 创建面向页面、可直接打印的文档。

一个 资源束 (resource bundle) 是一个包含区域设置特定数据的 Java 属性文件。它是一种使 Java 应用程序国际化(使其代码与区域设置无关)的方法。

JasperReports 中的本地化报表

下面的应用程序创建了一个可以生成三种不同语言的报表。

flags
├── england.png
├── russia.png
└── slovakia.png
in18
├── labels.properties
├── labels_ru.properties
└── labels_sk.properties
report.gvy
report.xml

这是项目结构。

in18/labels.properties
message=Tea report
flag=flags/england.png

这些是英文属性。

in18/labels_ru.properties
message=Чайный oтчет
flag=flags/russia.png

这些是俄文属性。

in18/labels_sk.properties
message=Čajový report
flag=flags/slovakia.png

这些是斯洛伐克文属性。

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="report2" pageWidth="595" pageHeight="842"
              columnWidth="555" leftMargin="20" rightMargin="20"
              topMargin="20" bottomMargin="20">

    <style name="title" fontSize="18" fontName="DejaVu Sans" hAlign="Center" />

    <background>
        <band height="802">
            <staticText>
                <reportElement mode="Opaque" x="0" y="0" width="555"
                               height="802" backcolor="#cccccc"/>
                <textElement/>
                <text><![CDATA[]]></text>
            </staticText>
        </band>
    </background>

    <title>
        <band height="200">

            <textField>
                <reportElement x="0" y="10" width="595" height="25" style="title" />
                <textElement />

                <textFieldExpression class = "java.lang.String">
                    <![CDATA[$R{message}]]>
                </textFieldExpression>
            </textField>

            <image>
                <reportElement x="15" y="50" width="150" height="100" />
                <imageExpression><![CDATA[$R{flag}]]></imageExpression>
            </image>

        </band>
    </title>

</jasperReport>

这是报表模板文件。它显示了本地化文本和图像。

<background>
    <band height="802">
        <staticText>
            <reportElement mode="Opaque" x="0" y="0" width="555"
                            height="802" backcolor="#cccccc"/>
            <textElement/>
            <text><![CDATA[]]></text>
        </staticText>
    </band>
</background>

一些国旗有白色条纹;因此,我们使用 backcolor 标签更改报表的背景颜色。

<textFieldExpression class = "java.lang.String">
    <![CDATA[$R{message}]]>
</textFieldExpression>

报表的消息通过 $R{} 语法从属性文件中检索。

<image>
    <reportElement x="15" y="50" width="150" height="100" />
    <imageExpression><![CDATA[$R{flag}]]></imageExpression>
</image>

同样,我们通过 $R{} 语法获取国旗的路径。该路径被传递到 imageExpression 标签。

report.gvy
package com.zetcode

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='net.sf.jasperreports', module='jasperreports-fonts', 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.engine.JREmptyDataSource

def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

def bundle = ResourceBundle.getBundle("in18/labels", new Locale("ru", "RU"))

def params = ["REPORT_RESOURCE_BUNDLE": bundle]
def jrPrint = JasperFillManager.fillReport(jrReport, params, 
    new JREmptyDataSource())

JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")

JasperResourceBundle 从数据源和 report.xml 模板创建 JasperPrint 文件。JasperPrint 代表一个面向页面的文档,可以查看、打印或导出为其他格式。

def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

XML 模板文件被编译成一个 JasperReportJasperReport 是一个已编译的模板,可以填充数据。

def bundle = ResourceBundle.getBundle("in18/labels", new Locale("ru", "RU"))

创建了一个 ResourceBundle。它指定了属性文件的位置和当前使用的区域设置。

def params = ["REPORT_RESOURCE_BUNDLE": bundle]

该资源束作为 REPORT_RESOURCE_BUNDLE 参数传递给报表。

def jrPrint = JasperFillManager.fillReport(jrReport, params, 
    new JREmptyDataSource())

创建了一个 JasperPrint 对象;一个可以查看、打印或导出为其他格式的对象。我们将一个空数据源和参数传递给 JasperFillManager.fillReport 方法。

JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")

JasperExportManager.exportReportToPdfFile 方法将 JasperPrint 导出为 PDF 文件。

在本文中,我们已经在 JasperReports 中生成了一个多语言报表。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出 所有 JasperReports 教程