报表中心
硕正报表功能 入口在系统菜单下
功能预览
- 左侧树型:展示可配菜单
- 上方表格:菜单下报表模型记录
- 下方预览:报表模板预览设置
- 按钮区块:
- 样式设计:打开样式设计画面
- 数据源:设置数据源
- 复制:复制当前选中模板记录
- 功能:导出模板 导入模板
简单示例
1.选中左侧树型菜单 如用户菜单 点击 模板配置表的新增按钮 新增模型记录
2.填写记录数据
- 报表名称:自定义报表名称 中英文不限
- 菜单名称:默认带出的菜单信息
- 启用:启不启用当前模板
- 打印预览:支不支持打印预览
- 标准模板:默认是标准模板
- 来源模板:复制的模板自动带出
- 数据源类型:可选默认 From
- 默认:数据源自定义配置
- From:从画面上获取数据源
- 打印控制:是否启用打印控制 控制一般包括能否打印
- 显示控制:是否启用显示控制 显示控制一般包括是否可选该模板进行打印
- 备注:备注信息
3.输入完记录信息后 保存该记录 如果数据源是Form的则不需要 配置数据源 如果 数据源类型是默认的 则 点击数据源按钮 进入配置数据源界面
数据源画面包括 数据源列表数据 输入参数 输出参数
先新增 一条数据源数据 类型可选 HQL SQL 和自定义 数据源名称 自定义 内容通过编辑语句 来填写
如 选择SQL 之后 点 编辑语句
4.返回 报表中心 点击 样式设计 按钮 打开 样式设计界面 进行样式设计
5.样式设计完成之后 如果 数据源是 Form 类型的报表 可以在 工具栏【报表】下 打印预览
如果 数据源是 默认类型的报表 可以 新建按钮 然后用代码打印
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
PrintReportArg printReportArg = new PrintReportArg(Form_SysUser.class);
printReportArg.addBatch();
result.printReport(printReportArg);
return result;
}
详细操作
基本操作(以报销单为例)
目标:
1.配置相应画面,建立测试数据:
2.新建报表:
进入报表中心,从左侧树形目录中选中需要配置报表的画面,点击新增。在开发环境下,我们可以得到一个标准模板
3.配置数据源:
点击右侧数据源按钮 添加报销单、报销单明细两个数据源
默认SQL类型,点击右侧编辑语句按钮,配置内容如下:
注意事项:
(1)字段需要设置别名,在后面的样式设计中,我们需要通过别名引入数据
(2)查询参数目前不支持使用匿名参数,要指定参数名称
(3)保存SQL前因执行SQL检查
引入数据源的方式有三种(SQL 语句、HQL语句、自定义)
(1) SQL和HQL:通过查询语句获取数据库中相应数据;语句的输入参数和输出字段在下表可见。
(2) 自定义:适用于处理比较复杂的数据。
自定义数据源:
4.样式设计
点击右侧样式设计按钮,进入样式设计界面
建议:及时保存,关闭当前页面,或者切换窗口,都会导致,操作更新失效。
箭头指向的工具是 数据源 ,数据源的相关属性都在这里配置
框线
系统默认A-F列,1到11行,选择行列右键新增(开始设计时,可以多增几列,便于操作)
新增的工具 边框 ,选中单元格区域,点击工具,可快速添加框线或移除( 边框属于 新增功能,旧版本并未提供)
注意到报销单的框线为绿色:选中需要设置框线的单元格,点击工具栏上的 工具箱
可对单元格区域进行详细设置
修改框线颜色为绿色,但是这里只能设置上边框和左边框,不能设置右边框和下边框
所以我们还要设置最后一行的下一行以及最后一列的下一列
合并单元格、填充内容、调整列宽
选中需要合并的区域,点击 单元合并 ,再点击,即可解除合并
填充内容,并设置字体样式
设置列宽,行高(可批量设置)
完成效果
插入文本框 绘制标题
文本框行为与单元格行为基本一致,区别是文本框可以自由移动,遮盖,更加灵活。
5.引入数据源
通过SQL语句已经能够获取到相应的数据,同时也完成了报表的界面设计。现在我们需要执行这个SQL语句,并把数据放到报表中。
所以在打印报表的按钮方法里,传入SQL语句需要的参数,并执行打印或预览。
关闭重启Tomcat,点击打印按钮,选择样式列表,即可进行打印预览
回到样式设计界面
右侧工具箱,点击“数据源”选项卡,即可看到数据源的列结构:
数据源的结构树分为“表”和“单个数据”, 可以用鼠标直接将其下级内容直接拖拽至报表中。
标题行 headrow( ) :
将 “表” 的 “标题行” 拖到报表的某个单元格,该单元格将会自动生成一个计算公式如 "=headrow('ds1')", 表示从该单元格开始,将数据源的标题从左向右填充。
数据行 datarow( ) :
将 “表” 的 “数据行” 拖到报表的某个单元格,该单元格将会自动生成一个计算公式如"=datarow('ds1')", 表示以该单元格作为左上角,将数据源填充至报表。
由于数据源的总行数是不确定的,所以报表将动态插入新的临时行。
从左向右的填充规则为:逐个单元格顺序填充,但遇到如下情况,将跨过这些单元格:
1.单元格是被组合的、不是主单元格;
2.单元格内有其它计算函数;
单个数据 data( ):
将 “单个数据” 下的的某个字段拖入报表的某个单元格(或文本框), 该单元格(或文本框)将自动生成一个计算公式如 "=data('ds1', 1, 'price')",
表示仅从数据源取得单个数据,填充到本单元格(或文本框), 这个函数的参数用于指定数据源的行号和列名。
使用效果:
6.数据处理
通过打印按钮,可以看到dataRow() 和 headRow() 使用效果, 但这并不完全符合我们的需求。我们需要对金额进行拆分,并填充到相应的单元格中。
现在,有两种实现思路,一种是,在传入数据时,就对数据进行相应的处理,通过SQL语句或者HQL语句(比较难实现),或者使用自义定的数据源,分装处理好。这种方式并不推荐。应为数据在传入前只关注数据本身,而不应当关注展示效果。一旦需求发生变化,难以做出及时的调整。
第二种:
报表提供了许多可使用的 计算公式,可直接拖动到单元格或文本框
效果如下图:
7.打印设置
在完成内容的绘制之后,我们需要对报表的打印进行设置
(1) 点击右下角分页显示,调整列宽,使内容在一页显示
(2)点击工具栏上打印设置工具
页面Tab页:
这里我们需要配置打印的一些基本参数,如纸张大小,份数,打印机等
可以使用斑马打印机驱动,完成自定义纸张大小
(表格的框线颜色还是黑色,这是因为配置了 "表格线以黑色打印"的原因)
页边距Tab页:
数据源Tab页:
在之前的打印效果中,使用了dataRow()方法,由于数据源的总行数是不确定的,所以报表将动态插入新的临时行
当前传入了6条记录,所以报表动态插入了5个新的临时行,这显然与实际效果不符合,一个报销单固定4行数据,我们想要的效果是:超出四行之后,使用下一个表单。
我们可以使用 数据源Tab 页中的 每页打印行数类设置,默认为0,不做控制。这里我们修改为4,并且勾上末页须以空行补足 (别忘了左上角的保存)
再来看一下打印效果:
可以看到,第四条记录后,相当于插入了一个分页符,分成了两页。
分页(1)Tab页:
目前效果,只是在每四行数据插入了一个分页符,还需要固定标题和表位。
可以在分页(1)中设置
使用效果:
Tip:
分页还有各种打印方式,这里我们选用的是允许分页。
这里提到了几个自动缩放,强制分页的功能,分页可以在这里设置
上述演示效果中,使用了A4纸,一张单据只占A4纸的一小部分,可配置需要一张纸打印多页
回到数据源Tab页 设置
8.小计
通过右边的这个例子我们发现,这里的合计数据在'分页'之后并不正确。合计这里的表达式为 =Sum(H6:@H6)
@+单元格 表示 表示数据源填充区内、总行数不确定时的动态单元名。所以这里的 "sum" 汇总的是当前数据源的金额总和。
但是,我们已经进行了分页。合计人民币 需要当前页面中的4条记录
这里就需要用小计的功能:
小计还有 分类汇总小计 和 区块汇总小计,分别在后续的 "分类汇总"和"区块汇总" 模块中做具体介绍
分类汇总
\简单排序**
以下是以各部门的员工的工资单为例:
目前展示的数据是分散的,可以借助数据的排序功能,做一个简单排序
以下是效果:
借助自定义排序功能,可以做个简单分类,但并不能对每个分类的数据进行一些分析统计
数据分类汇总
勾上垂直合并同类项,配置效果如下:
配置汇总行:
\配置效果:**
配置汇总行的小计项:
\使用效果:**
这里可以看到,虽然分类汇总这里提供了很多配置,但是,还不是很灵活,只能做一些简单的应用场景。下一章 "区块" 的介绍区块的分类汇总表,将有更为灵活的应用
区块
区块的理解
上面的几个例子,都使用了dataRow(),自动填充数据,一条数据占一行。
有的应用场景,一条数据 ,我们希望可以把它的字段,放到不同的行。
可以的做法( data('ds1',1,'字段') 的局限):
固定条数的传入数据,使用 data('ds1',1,'字段') 、data('ds1',2,'字段')、data('ds1',n,'字段')
这就导致了,传入数据时不够灵活,一但需求变更,后台也可能要做出调整。
针对这种场景,引入了区块的功能,下面以工资条为例:
datarowNumer() 表示数据源中的行号
同一行中,应该有包含dataRow( )函数的单元格
使用效果:
区块的分类汇总
区块除了可以存放一条数据,还可以存放一类数据
上一章 "分类汇总" 提到了使用不够灵活的一个局限,只能通过配置的方式来决定样式,并不能直接进行设计
结合使用区块可实现此目标。
目标效果:
操作步骤:
1.设为区块
2.配置分类
表达式可填的值:
@rows 行数
@Text 分类项内容
表达式可填的值:
@sum | 合计 |
---|---|
@average | 平均值 |
@max | 最大值 |
@min | 最小值 |
@first | 首行内容 |
@last | 首行内容 |
@rows | 行数 |
@Text | 统计项 |
宏可以和列名组合 ,比如 "金额@average"
3.设为明细行
区块里面必须要有一行只有明细项的函数,作为动态可插入行
交叉表(数据透视)
“\数据透视**”能够将筛选、排序和分类汇总等操作依次完成,并生成汇总表格
还是以工资单为例:
工资单记录都是平面的,现在要对这些数据按筛选项进行透视分析
例如,统计每个部门的性别组成、工资分布
\目标效果:**
操作步骤:
1.添加数据行
2.配置交叉表
计算公式
Supcan官网提供:http://supcan.cn/doc/dev/pub02.htm
Gongqi自定义计算公式
singleParmValue | 用于获取单例表指定字段值 |
---|---|
参数一 | entityName 单例表名称 |
参数二 | fileName 获取的字段名称 |
返回值 | String |
示例 | =singleParmValue('CompanyParameters','CompanyName') |
条码
表达式和掩码
表的表达式分二种:关系表达式和格式掩码。
所谓“关系表达式”就是如前所述的单元格与单元格之间的计算关系、列与列之间的计算关系、小计/合计运算逻辑;而“格式掩码”则是单元格用于描述自身显示的特殊的表达式。
报表的表达式在单元格内直接输入,举例如下:
格式掩码和关系表达式相比,没有什么大的差别,它还可以包含"textColor="的文字颜色分句。
使用效果如下:
掩码在 工具箱 -> 单元属性 ->显示格式 处进行配置