JasperReports 国际化
有时,我们需要不同语言的报表。为每种不同的语言编写相同的报表意味着很多多余的工作。仅应单独编写因语言而异的文本片段,并在运行时加载到文本元素中,具体取决于区域设置。这就是报表国际化的目的。国际化的报告,一旦编写就可以到处运行。
在以下步骤中,我们列出了如何生成不同语言的报告以及报表国际化的其他一些功能 :
-
将资源包java.util.ResourceBundle与报告模板相关联。有两种方法可以将 java.util.ResourceBundle 对象与报告模板相关联。
-
在设计时,通过将报告模板对象的resourceBundle属性设置为目标资源包的基本名称。
-
通过在填充报表时提供java.util.ResourceBundle对象作为 REPORT_RESOURCE_BUNDLE 参数的值,可以建立动态/运行时关联。
-
如果需要在与当前不同的语言环境中生成报告,则可以使用内置的 REPORT_LOCALE 参数在填写报告时指定运行时语言环境。
-
-
为了便于报表国际化,在报告表达式中可以使用特殊语法$R{}来引用与报告关联的java.util.ResourceBundle对象内的java.lang.String资源。在$ R {}字符语法提取从资源包基础上,必须在括号之间把钥匙语言环境特定的资源:
<textFieldExpression>
$R{report.title}
</textFieldExpression>
上述文本字段通过根据运行时提供的语言环境和report.title键从与报告模板关联的资源包中提取字符串值来显示报告的标题。
-
根据报告区域设置以不同语言格式化消息,报告net.sf.jasperreports.engine.fill.JRCalculator 中有一个内置方法。此方法提供类似于java.text.MessageFormat类的功能。此方法 msg() 具有三个方便的签名,允许您在消息中使用最多三个消息参数。
-
一个内置的str()方法(相当于报表表达式中的 $R{} 语法),它允许访问基于报表区域设置的资源包内容。
-
对于日期和时间格式,可以使用内置的 REPORT_TIME_ZONE 参数来确保正确的时间转换。
-
在生成的输出中,库保留有关文本运行方向的信息,以便可以正确呈现以从右到左书写的语言(如阿拉伯语和希伯来语)生成的文档。
-
如果应用程序依赖内置的 Swing 查看器来显示生成的报告,则需要通过调整按钮 ToolTips 或其他显示的文本来国际化。这很容易做到,因为查看器依赖于预定义的资源包来提取特定于区域设置的信息。此资源包的基本名称是net.sf.jasperreports.view.viewer。
JasperReports 国际化的示例
pom.xml文件
<dependencies>
<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.17.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
</dependencies>
jasper_report_template.jrxml模板文件:
<?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 = "jasper_report_template" language = "groovy" pageWidth = "595"
pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
topMargin = "20" bottomMargin = "20" resourceBundle = "localizationdemo">
<title>
<band height = "552">
<textField>
<reportElement positionType = "Float" x = "150" y = "20"
width = "400" height = "50"/>
<textElement>
<font size = "24"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{REPORT_LOCALE}.getDisplayName ($P{REPORT_LOCALE})]]>
</textFieldExpression>
</textField>
<textField isStretchWithOverflow = "true" isBlankWhenNull = "true">
<reportElement positionType = "Float" x = "20" y = "125"
width = "530" height = "20"/>
<textElement textAlignment = "Justified">
<font size = "14"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$R{localization.text1}]]>
</textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
在上面的文件中,<jasperReport> 元素的resourceBundle属性告诉 JasperReports 从哪里获取本地化的字符串以用于报告。我们需要创建一个属性文件,其根名称与属性值匹配。填写报告时,此文件必须存在于 CLASSPATH 中的任何位置。在本示例中,属性文件localizationdemo.properties保存在目录D:/根目录 下。该文件的内容如下 :
localization.text1 = This is English text.
要使用不同的语言环境,文件名必须是 localizationdemo[locale].properties。在这里,我们将为西班牙语言环境编写一个文件。将此文件另存为 - C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties。该文件的内容如下 -
localization.text1 = Este texto es en Español.
获取 resourceBundle 属性值的语法是 $R{key}。
为了让 JasperReports 知道我们希望使用什么语言环境,我们需要为内置参数赋值。该参数的名称定义为名为 REPORT_LOCALE 的常量,并且该常量在net.sf.jasperreports.engine.JRParameter类中定义。常量的值必须是java.util.Locale 的一个实例。
先编译报表文件:
package cn.xnip;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.JasperViewer;
public class JasperReportFill {
public static void main(String[] args) {
String filePath = "D:/idea_codes/jasper_reports/jasper_report_template.jrxml";
try {
JasperCompileManager.compileReportToFile(filePath,"d:/jasper_report_template.jasper");
System.out.println("编译成功");
} catch (JRException e) {
e.printStackTrace();
}
}
}
编译后在D:/盘根目录下生成jasper_report_template.jasper文件,然后再填充数据:
package cn.xnip;
import net.sf.jasperreports.engine.*;
import java.util.ArrayList;
public class JasperReportFill {
public static void main(String[] args) {
String sourceFileName = "d:/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
try {
JasperFillManager.fillReportToFile(
sourceFileName, null, new JREmptyDataSource());
} catch (JRException e) {
e.printStackTrace();
}
}
}
填充数据完毕后,在D:/盘根目录下生成jasper_report_template.jrprint文件,最后使用预览程序预览:
package cn.xnip;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.JasperViewer;
public class JasperReportFill {
public static void main(String[] args) {
String filePath = "D:/jasper_report_template.jrprint";
try {
JasperViewer.viewReport(filePath,false);
} catch (JRException e) {
e.printStackTrace();
}
}
}
最后输出结果如下: