简介
在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表。其实除了Excel报表之外,PDF报表也有广泛的应用场景,例如货运详情,货运单等。
目前世面上比较流行的制作PDF报表的工具如下:
- Jasper Report:是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF。Jaspersoft Studio的前身。
- iText PDF:iText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
- Openoffice:openoffice是开源软件且能在windows和linux平台下运行,可以灵活的将word或者Excel转化为PDF文档。
常见操作
- 模板编辑器Jaspersorft Studio下载地址Find out more about Jaspersoft Studio | SourceForge.net
- JRXML:报表填充模板,本质是一个XML;Jasper:由JRXML模板编译生成的二进制文件,用于代码填充数据。
- 如何打开已经隐藏的窗口:菜单栏依次选择window→show view→other→已经隐藏的窗口名→Open
- 在TIBC Jaspersoft Studio 6.2.0版本下,在打开jasper文件编辑时在软件中是以jrxml文件格式进行体现的,要使用jxml文件进行模板编辑,在编辑完点击“Save”按钮,作用是:将当前编辑的结果保存成新版本的jrxml文件,并未生成新的jasper文件;点击“Compile Report”按钮,作用:根据当前编辑完成的jrxml文件内容,保存生成与之对应的jasper文件。
- 查看当前模板的纸张大小信息:鼠标移至模板页面左边线上部区域,点击鼠标右键,弹出模板菜单页面,在模板菜单页面点击“Page Format…(页面格式…)”按钮,调出纸张设置对话框。
- 新建模板步骤:在菜单栏中依此选择File→New→Jasper Report,进入到Report Templeates(报表模板)界面;在Report Templeates界面选择需要的模板,点击“Next”,进入到Report File(报表文件)界面,可修改模板存放路径和模板名称;在Report File界面点击“Finish”,完成报表模板创建(点击“Next”按钮,进入到Data Source(数据源)配置界面,不需要操作)。
- 在模板中添加元素:在“Palette”视窗中,选中自己所需要的元素(动态文本、静态文本、条形码文本等等),拖拽至模板中对应的位置上,完成模板元素新增操作。
- 在模板中给元素添加框架:通过鼠标选中所需元素,点击鼠标右键,弹出菜单页面,点击“Enclose into Frame”按钮,完成元素框架添加。
- 给动态文本添加字段:在“Outline”(大纲视图)菜单中,选中“Field”按钮点击鼠标右键,弹出菜单,点击“Create Field”按钮,在软件界面右边弹出字段的“Properties”(属性栏)窗口,可编辑字段的名称、字段描述、字段类(class,选择“java. Lang.String”)。
- 更改文件存储的位置:打开主菜单“File —> Switch WorkSpace”,选择你打算存放报表工程及报表设计文件的目录。
- 建立数据库连接:在“Repository Explorer”页签,依次进入“Data Adapter—>Create Data Adapter—>数据库连接方式(一般选择Database JDBC Connection)—>数据库连接配置(填写所连接数据库配置信息)—>Driver Classpath(添加相应数据库的jar包的存放路径)”
-
sqlserver本人选择框起来那个,选择另一个报错,所以看个人工具及数据库版本
连接数据库需要添加相应的jar包
MySQL:
Sqlserver:
- 建立主数据源(主档数据源)
界面元素解释
名称 | 翻译 | 备注 |
Jrxml | jaspersoft的编辑文件格式 | 一种XML文件格式,用于保存和共享为JasperReports库和使用它的应用程序(如JasperSoft Studio和JasperReports服务器)创建的报表。JRXML是一种开放格式,它使用XML标准精确定义报表的所有结构和配置。 |
Jasper | jaspersoft的运行文件格式 | JRXML模板编译生成的二进制文件,执行PDF报表打印的代码运行格式文件。 |
Title | 标题面板 | 只在首页打印一次 ,报表面板 |
Detail | 内容面板 | 详情,根据数据数量,自动循环输出,报表面板。 |
Column Header | 行首面板 | 通常用来定义行的字段名称。每页都打印,报表面板。 |
Page Header | 页首面板 | 每页都打印,报表面板。 |
Page Footer | 页尾面板 | 每页都打印,报表面板。 |
Column Footer | 行尾面板 | 可用来告知报表的一些参数,诸如页码等。每页都打印,报表面板。 |
Last Page Footer | 最后页的页尾面板 | 只在最后页打印一次。 |
Palette | 调色板 | 调色板包含三个部分:Basic Elements(基本元素),Composite Elements(复合元素,其他元素组合创建的元素), Components(组件,软件商业版中可用元素)。通过拖拽调色板中的三个部分的元素至报表各类面板中,实现元素在报表中的新增 。 |
Composite Elements | 复合元素 | 复合元素是一个或多个可以在报表中使用的预配置元素。你可以配置元素的大小、颜色或字体等属性,或创建具有复杂经常使用的表达式,然后将其另存为复合元素。复合元素不能包含基于数据集的元素,例如图表或交叉表。 |
Basic Elements | 基本元素 | 报表的基本构造块是元素,一切都是通过元素创建的,元素可以包含文本、创建表格、显示图像等。 |
Note | 备注 | Basic Element里的元素, |
Text Field | 字段文本 | Basic Element里的元素,动态文本字段允许您打印使用表达式创建的任意文本部分(或数字或日期)。 |
Static Text | 静态文本 | Basic Element里的元素,通常标题使用此格式。 |
Image | 图片 | Basic Element里的元素 |
Break | 强制分页符 | Basic Element里的元素 |
Rectangle | 矩形 | Basic Element里的元素 |
Ellipse | 椭圆 | Basic Element里的元素 |
Line | 线条 | Basic Element里的元素 |
Frame | 框架 | Basic Element里的元素,框架是一个矩形元素,可以包含其他元素,还可以选择在它们周围绘制边框。框架内的元素是相对于框架而不是相对于标注栏定位的,当移动框架时,框架中包含的所有元素都会一起移动。框架会自动拉伸以适合其内容。 |
Subreport | 子报表 | Basic Element里的元素 |
Barcode | 条形码、二维码 | Basic Element里的元素 |
Chart | 图表 | Basic Element里的元素 |
Properties | 属性栏 | 元素属性分为多个类别,通过“属性”视图中的选项卡可见。可用的属性依赖于元素类型。类别包含以下几类:Appearance、Borders、Element、Inheritance、Hyperlink |
Appearance | 外观选项卡 | 外观选项卡允许您设置元素的位置、大小、颜色和文本样式。 |
Borders | 边框选项卡 | 允许设置元素的填充和边框样式、颜色和宽度。 |
Text Field , Note, Static Text, Image,and so on | 元素名 | 允许设置评估时间以及特定于元素类型的属性。例如:静态文本选项卡允许您为字段定义不可更改的文本,并控制其外观;文本字段选项卡允许设置文本字段元素的格式和位置;图像选项卡允许您设置图像对齐、填充和缩放属性。 |
Inheritance | 继承选项卡 | 会显示当前元素的基本属性(Element attributes),能够重置当前属性(Reset Elements Properties),会显示报表的默认属性(Default attributes),允许查看从其他级别继承的任何属性,并在可能时覆盖这些属性。 |
Horizontal Alignment | 水平对齐位置 | 选项:CENTER(居中对齐)、LEFT(左对齐)、RIGHT(右对齐)、JUSTIFIED(两端对齐) |
Bold | 字体加粗 | 选项:True(加粗)、Flase(不加粗) |
Box Top/Bottom/Left/Right Line Style | 上/下/左/右边框线类型 | 选项:Solid(实线)、Dashed(虚线)、Dotted(点线)、Double(双实线) |
Box Top/Bottom/Left/Right Line Width | 上/下/左/右边框线宽度 | |
Backcolor | 背景色 | |
Hyperlink | 超链接选项卡 | 允许在元素中定义图像、文本字段和图表的超链接。 |
java. Lang.String | 常量字符串 | |
Undo | 撤消 | |
Redo | 恢复 | |
Outline | 大纲视图 | 包含了当前编辑的报表的所有基础信息,包括一些固定区域的样式(Style)、报表参数(Parameters)、字段(Fields)、变量(Variables)、直接链接((Title)标题面板、(Detail)内容面板等)等,我们可以方便地查看和修改。点击一个面板的链接之后,我们可以在右侧的属性视图(Properties)中查看和修改该面板对应的一些基本属性,如高度、布局。 从大纲视图中我们发现,一个报表包含很多固定的面板。在每一个报表中标题和汇总(summary)面板只打印一次,页眉(header)和页脚(footer)在报表的每一页都会独立打印。我们可以直接在field中新增、删除字段,还可以将字段拖拽到报表的细节面板中,Jasper Studio将会为我们创建一个文本字段(text field)元素,并设置其值为对应字段的数据。文本字段不应出现在除细节面板之外的其它地方。 |
Field | 字段 | 大纲视图下的子单元菜单,在报表中,有三组对象可以存储值:字段(Field)、参数(Parameters)和变量(Variables)。点击“Create Field”按钮,对当前报表进行新增字段;“Field”表单下会显示当前报表中所有的字段信息。 |
Parameters | 参数 | 大纲视图下的子单元菜单,在报表中,有三组对象可以存储值:字段(Field)、参数(Parameters)和变量(Variables)。 |
Variables | 变量 | 大纲视图下的子单元菜单,在报表中,有三组对象可以存储值:字段(Field)、参数(Parameters)和变量(Variables)。 |
Text Field Menu | 动态文本菜单 | 鼠标在面板中选中动态文本,点击鼠标右键,弹出菜单,菜单目录如下: Undo Change Text Field Expression:撤消更改文本字段表达式 Redo:恢复 Cut:剪切 Copy:复制 Paste:粘贴 Copy Format: Enclose into Frame:装入框架 Save as Composite Element: Add to Template Set: Delete:删除 Show Properties: Order: Align in Container: Size to Container: Arrange In Container: Oragnize as Table: Add Detail Band: Stretch To Content: Convert to Static Text:转换为静态文本;将动态文本属性调整成静态 Fit text in element:在元素中调整文本; JSON Tags: CSV Tags: XLS Tags: PDF 508 Tags: |
Report State | 报告状态 | 操作编译jasper文件中的jrxml源文件时,显示编译运行的日志信息 |
Page Format | 页面格式 | 主要是模板页面的属性信息,包含:Format(纸张大小,A4、A3等等),Width(纸张宽度),Height(高度),Page Orientation(页面方向,包含选项:Portrait(纵向)、Landscape(横向)),Units(单位,cm、mm、pixel等),Margins(边距,包含:Top(上部)、Bottom(下部)、Right(右边)、Left(左边)),Columns(面板,包含:Columns(面板数量)、Column Width(面板宽度)、Space(空间)、Print Order(打印顺序,包含选项:Vertical(垂直)和Horizontal(水平)))。 |
Location | 坐标 | 以当前元素的左上角的坐标作为当前元素的坐标。 |
Parameters 下的那些灰色参数,表示是系统级的参数,不能编辑或者删除它。
Jaspersoft Studio 定义了一些内置参数(Parameters),具体说明如下:
内置参数 | 说明 |
REPORT_PARAMETERS_MAP | 使用者调用 API 中的 fillReport() 方法所传入的 Map 型键值对参数。 |
REPORT_CONNECTION | 报表中的 JDBC connection,用于执行 SQL 语句。 |
REPORT_MAX_COUNT | 报表所能填充的最大记录数。如果未指定,则没有限制。 |
REPORT_DATA_SOURCE | 如果没有使用 JDBC connection(比如非数据库的数据源 CSV 等),将会使用这个参数。 |
REPORT_SCRIPTLET | 报表创建时的脚本实例,默认使用 net.sf.jasperreports.engine.JRDefaultScriptlet。 |
REPORT_LOCALE | locale 区域设置,一般用于国际化场景。默认为系统值。 |
REPORT_TIME_ZONE | 所在时区,默认为系统值。 |
REPORT_FORMAT_FACTORY | 默认实现是 net.sf.jasperreports.engine.util.FormatFactory。可以参考该工厂类,实现自定义工厂。 |
REPORT_CLASS_LOADER | 可用于设置报表填充时的 class loader。 |
REPORT_URL_HANDLER_FACTORY | 可用于指定创建 URL handlers 实现工厂。 |
REPORT_FILE_RESOLVER | 默认实现是 net.sf.jasperreports.engine.util.FileResolver,用于解析报表中的资源路径,也可以自定义。 |
REPORT_VIRTUALIZER | 定义报表填充器的实现类,默认为 JRVirtualizer 接口的实现类。 |
IS_IGNORE_PAGINATION | Boolean 类型,分页开关。默认情况下,除了导出 excel 与 HTML 之外,其它情况不分页。 |
常见问题处理
问题 | 原因 | 解决方法 |
Element reaches outside frame width:x =0,width=122,available width=120 | 元素达到外部框架宽度:x=0,宽度=122,可用宽度=120 | 根据报错信息,调至到Source界面,查看错误元素位置,在模板中进行调整修改 |
An internal error occurred during: "Building report".java.lang.Null Pointer Exception | 在代码来源(Source)一栏中报表代码中某个元素的类型开始和结束不一致 | 正确表达式为: eld> … … ield> 或 Text> … … cText> |
在Jaspersoftstudio软件界面,针对编辑好jrxml格式的文件,点击“Compile Report”按钮,无法保存生成jasper文件 | Jaspersoftstudio生成jrxml的版本与打开jrxml的版本不一致 | 使用新版本的Jaspersoftstudio打开jasper文件重新生成jrxml。 |
根据模板(模板仅一页内容)执行打印时,打印机会打印出一张有内容的和一张空白页,或会进行正反两面打印(一面有内容一面没内容) | 维护模板时模板有空白页产生 | 针对仅有一页内容的模板,在每次编辑模板完成时都需要点击“Preview”进行模板预览,在模板预览界面中如果发现“Page 1 of 2”,那么就表示改模板占据两页,存在空白页,需要在“Outline”下选择当前模板的Properties(属性栏)找到“When no data type”一栏,选择“All Sections No Detail”,再点击“Compile Report”按钮,进行jrxml文件保存,再点击“Preview”进行模板预览,如果还不行,增大模板下边框间距,确保模板内容不超过纸张底线,再点击“Compile Report”按钮,进行jrxml文件保存,再点击“Preview”进行模板预览。 |
在编辑打印模板时,添加条码组件后,打印后会将条码中的数值显示到条码下方 | Jaspersoftstudio软件高版本中会自动将条码信息以明文的形式显示出来 | 使用TIBC Jaspersoft Studio 6.2.0版本进行编辑带有条码组件的模板。 |
提示报错: There are compilation errors please fix the design. 详细报错: Invalid character constant Errors were encountered when compiling report expressions class file: | 使用了Jasper格式进行编译预览,导致无法保存 | 可以使用jasper文件对应的rxml文件在设计器中进文件行编译 |
详细报错: The operator / is undefined for the argument type(s) java.lang.String,java.lang.String Error were encountered when compiling report expressions class file: | ||
当配置单打印显示为null时 | jasper模板中动态文本的编号未在模板字段关系中维护关联关系,导致无法映射关联取值 | 在模板字段关系中维护关联关系 |
当配置单打印显示为N/A时 | 根据模板字段关系的关联关系,校验取值取到空值 | |
当配置单动态取值打印照片显示为空白时 | 1、jasper模板中动态文本的编号未在模板字段关系中维护关联关系,导致无法映射关联取值 2、根据模板字段关系的关联关系,校验取值取到空值 | |
在jaspersoft中创建模板报表,连接数据库,编辑执行查询视图的SQL语句后,点击Jaspersoft中的预览界面,正常输入变量参数,无法预览。预览界面显示“Document is empty”。 | 因为对用的数据库表中无结果数据 | 在对应的数据表中插入数据,使得查询的视图中存在可用数据。 |
获取打印模板通过打印服务器进行打印时,发现打印内容不展示,空白显示(有时候会出现部分信息能够打印显示,部分信息不能够打印显示) | 打印服务器字体中不包含打印模板中的字体,导致无法进行信息展示 | 将打印模板中的字体调整为打印服务器中有的字体 |
通过Jaspersoft Studio设计器打开别人发的jasper格式文件时,页面有报错提示:Failed to create the part‘s controls ,紧接着页面关闭。 | 接收到的jasper格式文件采用的是低版本( 6.2.0 )的Jaspersoft Studio设计器编译生成的,高版本的设计器在打开时不兼容 | 使用高版本的Jaspersoft Studio设计器打开对应jrxml文件进行重新编译生成jasper文件 |
函数表达式
表达式 | 含义 | 备注 |
"".equals( $F{D020} )?"X":$F{D020} | 当变量D020的值等于空字符串时,返回为“X”,否则,返回对应的变量值 | equals()方法用于判断两个对象是否相等。 |
$F{D090}.replace("|","\n") | 当变量D090的值中出现“|”时,将“|”替换成换行符 | replace() 方法通过用 newChar 字符替换字符串中出现的所有 searchChar 字符,并返回替换后的新字符串。 |
null==$F{D001} ?"":$F{D001}.concat("_").concat($F{D006}) | 当变量D001的值为null时,将变量D001的值赋予为空字符串,否则,将返回对应的变量值,最后将D001值和D006值用“_”进行拼接。 | concat() 方法用于将指定的字符串参数连接到字符串上。 |
$F{H004}.substring(0,4) | 截取变量H040的值前四位 | substring(int,int) |
null == $F{D020} || "".equals( $F{D020} )?"X":$F{D020} | 当变量D020等于空字符串或null值时,返回为“X”,否则返回对应的变量值 |