【转载】关于报表生成工具jasper的使用说明

最近在用jasper开发报表项目,第一次使用jasper开发报表,这份文档出自于技术平台小组姚老弟之手,觉得总结的很不错遂记录博客,转载或转发请注明作者;姚老弟!!
JasperReport使用
1.编写设计模板(.jrxml文件)
(1)元素
: jrxml文件根元素

: 声明以检索报表结果的SQL语句,若数据源是JavaBean则为空

: 声明参数,在报表填充阶段以Map参数传入

: 声明用于从数据源或查询数据映射到报表模板。
: 包含于,标识数据源中的字段名称

	<field name="Country" class="java.lang.String">
	    <fieldDescription><![CDATA[country]]></fieldDescription>
	</field>

: 声明排序字段

: 声明变量,可用于计数、求和、平均、最低、最高、方差等计算

: 定义不依赖于任何数据源,变量,参数或报表表达式静态文本

: 定义结果字段。

: 包含显示在报表中的数据。

报表区段(section):

:标题 :页眉 :列头 :分组头 :数据显示区域 :分组脚 :列尾 :页脚 :末页脚 :总结 :空数据集时显示的静态文本(将根元素属性whenNoDataType设置为NoDataSection) :背景

所有上述报表区段都是可选的。每一节都包含一个单一的元素作为其唯一的子元素(detail可有多个band)。一个可以包含零个或多个下列子元素:
, , , , , , , or
这些元素都必须包含一个作为其第一个元素(除了elementGroup)。
下表总结了属性:
属性 描述 有效值
x 指定频带元件的x坐标。 一个整数值,表示以像素为单位的元素的x坐标。此属性是必需的。
y 指定频带元件的y坐标。 一个整数值,表示在y以像素为元素的坐标。此属性是必需的。
width 指定频带元件的宽度。 一个整数值,表示该元素的宽度以像素为单位。此属性是必需的。
height 指定频带元件的高度。 一个整数值,表示以像素为元素的高度。此属性是必需的。
key 带元素的唯一标识符。 唯一字符串值。
stretchType 指定包含带延伸当元素如何延伸 NoStretch (default): 该元素不会延长。
RelativeToTallestObject: 该元素将伸展以适应它的组的最高的对象。
RelativeToBand: 该元素将延伸到适合带的高度。
positionType 指定当频带延伸元素的位置。 Float: 元素将取决于周围元件的尺寸移动。
FixRelativeToTop (default): 该元素将保持一个固定的位置相对于带的顶部。
FixRelativeToBottom: 该元素将保持一个固定的位置相对于带的底部。
isPrintRepeatedValues 如果指定的值重复打印。 true (default): 重复的值将被打印出来。
false: 重复的值将不被打印出来。
mode 指定元素的背景模式 不透明的,透明的
isRemoveLineWhenBlank 如果指定了当它是空白,并有在相同的水平空间没有其他元素的元素应被删除。 true, false
isPrintInFirstWholeBand 如果指定的元素必须打印在整个频段,也就是说,未被报表的页面或列之间分割的波段。 true, false
isPrintWhenDetailOverFlows 指定是否当频带溢出到新页或列中的元素将被打印出来。 true, false
printWhenGroupChanges 指定在指定的组改变元素将被打印。 string值
forecolor 指定元素的前景色。 无论前面加上#字符,或以下预定义值中的一个十六进制RGB值:black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, yellow, white.
backcolor 指定元素的背景颜色。 同样作为有效值的前景色

扫描二维码关注公众号,回复: 8694215 查看本文章

(2)表达式
字段引用: $F{XXX}
变量引用: $V{XXX}
参数引用: P X X X : P{XXX} 资源包引用: R{XXX}
条件表达式:{cond} ? {语句1} : {语句2}
(3)变量
Calculation属性:
Count − 非空值计算.

First − 变量表达式的第一个实例的值.

Highest − 表达式最大值.

Lowest − 表达式最小值.

Nothing − 不对表达式进行计算.

StandardDeviation − 变量值是与报表表达式匹配的所有非空值的标准差。仅对数字变量有效.

Sum − 表达式非空值总和.

System − 变量值是自定义计算(使用JasperReports的scriptlet功能自行计算该变量的值).

Variance − 变量值是通过评估报表变量的表达式返回的所有非空值的方差.
IncrementType(决定了何时增量计算):
Column − 在每列的末尾重新计算变量值.

Group − 当incrementGroup指定的组更改时,将重新计算变量值.

None − 每条记录都重新计算表达式.

Page − 每页尾重新计算表达式.

Report − 在报告结束时重新计算变量值一次.
IncrementGroup:
当incrementType为Group时,这将确定重新计算变量值的组的名称。这将获取JRXML报告模板中声明的任何组的名称。
ResetType(决定了何时重置变量的值):
Column − 变量值在每列的开头重置.

Group − 当incrementGroup指定的组更改时,将重置变量值.

None − 不会重置变量值.

Page − 变量值在每个页面的开头重置.

Report − 变量值仅在报告开头重置一次.

2.编译模板文件为.jasper文件
JasperFilePath = JasperCompileManager.
compileReportToFile(templatePath);
3.生成数据源
(1)JavaBean数据源:
得到数据集:
List list = getDao.query();
将数据集作为参数传入JRBeanCollectionDataSource构造函数得到实例:
JRBeanCollectionDataSource conn = new JRBeanCollectionDataSource(dataList);

(2)JDBC数据源:
在模板中定义sql语句:
如:<![CDATA [select * from tableName]]>
sql参数传入:
通过表达式传入参数:
如:<parameter name =“name”class =“java.lang.String”/>
<![CDATA [select * from user where name = $P{name} ]]>

P s q l 使 P{}表达式会处理字符串的双引号,若想操作sql语句本身,使用 P!{}表达式,
如:
<parameter name =“OrderClause”class =“java.lang.String”/>
<![CDATA [SELECT * FROM user ORDER BY $ P!{OrderClause}]]> </ queryString>
+
sql语句中条件查询建议使用表达式$X{functionName, param1, param2,…}代替where语句,该表达式能处理大多数空值问题,不会出现where column=null导致查询语句错误,表达式详细用法见:
http://jasperreports.sourceforge.net/sample.reference/query/
Java代码中创建jdbc连接:
String url = “xxxxx”;
Class.forName(“xxx”);
Connection conn = DriverManager.getConnection(url, “root”, “root”);
(3)其他数据源
详细可见:
http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRDataSource.html

4.导入.jasper文件、参数、数据源填充报表生成.jrprint文件
定义参数
Map parameters = new HashMap();
parameter.put(“author”,”yaowq”);
Parameter.put(“title”,”masCurrencyInfo”);
用JasperFillManager类填充报表
printFileName = JasperFillManager.fillReportToFile(JasperFilePath , parameters,
conn);//printFileName为jrprint文件路径
Jasperreport的填充过程
1.title:报表最开始
2.pageHeader:title之下和之后的每一页最上方
3.columnHeader:每存在detail数据的页的数据上方
4.(*坑)detail:数据集中每有一个元素,填充一次detail
5.columnFooter:每存在detail数据的页的数据下方
6.pageFooter:每一页最下方
7.lastPageFooter:最后一页的页脚,会替代pageFooter
8.summary:总结的内容
9.noData:空数据源时填充的内容
10.background:每页的背景
5.由.jrprint文件导出报表
(1)PDF
JasperExportManager.exportReportToPdfFile(printFileName,destFileName);
(2)HTML
JasperExportManager.exportReportToHtmlFile(printFileName,destFileName);
(3)EXCEL
JRXlsExporter exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME, printFileName);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,destFileName);
exporter.exportReport();
(4)etc.
6.使用JasperSoft Studio生成报表模板
Window>>preferences>>jaspersoft studio>>compatibility选择相应的JasperReports版本,否则可能出现兼容性问题
File>>new>>Jasper Report选择相应的jrxml文件模板
通过拖拽向模板添加元素。outline窗口中可以看到整个xml的树形结构,选中相应元素,在右下角窗口编辑元素属性
报表实例:
1.使用jasper studio生成jdbc数据源的简单报表
创建模板:

选择数据源:

输入sql语句,jasper使用jdbc执行sql后获得的数据集来填充detail区段

添加字段声明:

添加group声明,添加后会按group声明字段组织数据:

生成报表后可点击preview预览报表

2.主子报表(jdbc数据源)
创建子报表
在jasper studio中通过拖拽向detail中添加subReport元素,选择生成新的报表:

选择子报表数据源并输入sql语句:

选择使用与主报表相同的jdbc连接:

由主报表向子报表传入参数,参数可使用表达式,见1.1.2:

完成子报表的创建。注意:主报表中 columnWidth < pageWidth,所以子页面的pageWidth应设置成主页面的columnWidth,否则子页面不居中,甚至可能溢出主页面的范围。

主子报表的数据组织:
注意detail的填充方式,jasper根据报表的填充数据集,使用迭代器依次获取数据来填充detail,所以,若要生成主表与字表分离的报表,需要将主表和字表都写入subreport中进行展示,且保证主报表的sql语句只产生一条数据(如count(*))。
假设需要从下表得到主子表分离的报表:
Country City Population
China Shanghai 2m
China Beijing 2m
Japan Tokyo 0.5m
Japan Osaka 0.5m
America New York 1m
America San Francisco 1m

报表的结构示意为:
mainReport:{
Sql: select count(*) from table //detail填充一次
Detail:{
subReport1:{
Sql: select distinct country from table// detail填充3次,在detail
中输出相应的field
Detail: KaTeX parse error: Expected 'EOF', got '}' at position 12: F{country} }̲ subReport2:{ S…F{country}):{
Sql: select * from table where country=$P{country}// detail根
据表中记录的不同国家的城市个数填充
Detail: $F{City}, KaTeX parse error: Expected 'EOF', got '}' at position 15: F{Population} }̲ } } } } 3.主子报表…F{citys})

报表结构与jdbc数据源结构相同。

通过筛选打印数据,只有中的表达式为true时才会打印所在元素,在jasper studio中可在outline选中该元素,在窗口右下角编辑元素print when expression:

Jasperreport教程:
https://www.tutorialspoint.com/jasper_reports/index.htm
官方文档:http://jasperreports.sourceforge.net/api/overview-summary.html

再次声明,转载注明出处:姚老弟!!

发布了13 篇原创文章 · 获赞 4 · 访问量 3211

猜你喜欢

转载自blog.csdn.net/leadder/article/details/93919153