hy.common.report
报表操作类库
主导**: 由Excel模板文件 + XML配置文件即可定义一张报表。无须编写代码,实现快速、高效、简单的开发报表。
基于Apache POI接口。实现对*.xls 、*.xlsx两种文件格式的操作。
可保证生成2003版本与2007版本的Excel格式是一样的。
Excel模板文件中定义变量名称,格式为 ":xx.yy.zz" ,通过反射生成报表数据。格式中的冒号 ":" 可通过模板XML配置定义更换。
1. :xx.yy[].zz 方括号表示前面的方法名称的返回类型是集合对象。目前支持List、Set、Map三种集合。并须对集合遍历动态生成数据。
2. :xx.yy.$size 美元符表示其后的方法名称是一个完整的方法名称,无须加get或set前缀。
系统也定义一些固定系统变量名称,如下:
1. :RowNo__ 数据行号的变量名称。下标从1开始
2. :RowIndex__ 数据索引号的变量名称。下标从0开始
3. :RowCount__ 数据总量的变量名称
4. :RowSubtotalCount__ 数据小计总量的变量名称
Excel常规模板举例
1. 列宽问题:请将模板中的每一列的列宽均设置成整数(或合适的小数),这将影响生成报表的列宽。(POI在换算单位时,除值后取整,可能造成列宽有差异)。
2. 单元格颜色问题:在使用2003版本的模板时,单元格颜色最好设置为标准颜色,否则会出现颜色的失真。
常规报表的生成结果
XML常规配置举例
<?xml version="1.0" encoding="UTF-8"?>
<config>
<import name="xconfig" class="java.util.ArrayList" />
<import name="template" class="org.hy.common.report.bean.RTemplate" />
<!-- 报表模板配置信息 -->
<xconfig>
<template id="ReportTemplate">
<name>模板名称</name>
<excelFileName>classpath:JU_ExcelHelp.xls</excelFileName> <!-- Excel模板文件所在地方。并通过扩展名识别文件格式类型 -->
<titleBeginRow>0</titleBeginRow> <!-- 定义报表标题在模板中位置 -->
<titleEndRow>0</titleEndRow>
<dataBeginRow>1</dataBeginRow> <!-- 定义报表数据在模板中位置 -->
<dataEndRow>59</dataEndRow>
<totalBeginRow>60</totalBeginRow> <!-- 定义报表合计在模板中位置 -->
<totalEndRow>61</totalEndRow>
<dataClass>org.hy.common.report.junit.ExcelBean</dataClass> <!-- 定义报表数据对应的Java类型 -->
<valueSign>:</valueSign> <!-- Excel模板中值的标记。默认为一个冒号。通过它识别要反射获取的值。支持 xx.yy.zz 格式 -->
<call name="addListener"> <!-- 定义自定义变量名称的二次加工事件 -->
<listener class="org.hy.common.report.event.ImageListener">
<valueName>:image</valueName> <!-- 定义变量名称 -->
<beginRow>29</beginRow> <!-- 定义动态图片在模板中的位置 -->
<endRow>43</endRow>
<beginColumn>0</beginColumn>
<endColumn>8</endColumn>
</listener>
</call>
</template>
</xconfig>
</config>
报表生成及保存的Java代码举例
// 获取报表模板对象
RTemplate v_RTemplate = (RTemplate)XJava.getObject("ReportTemplate");
ExcelHelp.save(ReportHelp.write("Excel工作表名称" ,数据集合 ,v_RTemplate).getWorkbook() ,"Excel报表保存目录及名称");
Excel动态行+小计模板举例
1. []:方括号表示前面的方法名称的返回类型是集合对象。目前支持List、Set、Map三种集合。并须对集合遍历动态生成数据。
2. $:美元符表示其后的方法名称是一个完整的方法名称,无须加get或set前缀。
动态行+小计报表的生成结果
XML小计配置举例
<?xml version="1.0" encoding="UTF-8"?>
<config>
<import name="xconfig" class="java.util.ArrayList" />
<import name="template" class="org.hy.common.report.bean.RTemplate" />
<!-- 报表模板配置信息 -->
<xconfig>
<template id="ReportTotalSubtotal">
<name>小计、分组数据的报表演示</name>
<excelFileName>classpath:JU_Total_Subtotal.xlsx</excelFileName>
<titleBeginRow>0</titleBeginRow>
<titleEndRow>1</titleEndRow>
<dataBeginRow>2</dataBeginRow>
<dataEndRow>2</dataEndRow>
<subtotalBeginRow>3</subtotalBeginRow> <!-- 报表小计的开始行号(包括此行)。下标从零开始 -->
<subtotalEndRow>4</subtotalEndRow> <!-- 报表小计的结束行号(包括此行)。下标从零开始 -->
<dataClass>org.hy.common.report.junit.total.OrgInfo</dataClass>
</template>
</xconfig>
</config>
十分感谢以下朋友支持与建议
-
邹德福:建议使用简单的反射规则,如 :staffs[].staffName ,而非之前的 :staffs.$get(index).staffName 完整Java方法路径形式。
-
李 浩:建议对动态数据及小计功能的支持。