说明:
报表模板的编辑有两种方式:一种为读入一个已经存在的报表模板,对其进行修改后保存;另一种为创建一个空白报表模板,逐行逐列设置单元格属性,最后保存。
其中读入报表模板的示例参见2.1.1.1,修改属性和设置属性基本一样,如有不同之处,在介绍设置属性时会提出说明一下。因此本小节重点从创建空白报表——〉逐行逐列设置属性——〉保存报表模板 为主线,介绍例子代码的编写。
参考文件:CustomReport.java
ReportDefine rd=new ReportDefine2(3,3); //新建一个空白报表
● 注意:ReportDefine和ReportDefine2的区别:若使用程序生成报表模板,可直接使用ReportDefine,ReportDefine2是为IDE使用开发的,直接提供以下一些功能:行列插入删除时能自动更新表达式、两个合并格的相交边框必须相同等
常规
一般常规属性可以直接在ReportDefine对象中设置,如下
rd.setSubmit(ReportDefine.SUBMIT_UPDATABLE); //设置数据提交方案,ReportDefine.SUBMIT_UPDATABLE代表要保存的单元格,ReportDefine.SUBMIT_ALL代表所有单元格,ReportDefine.SUBMIT_UPDATABLE_WRITABLE代表要保存的和可写的单元格
rd.setReportType(ReportDefine.RPT_NORMAL); //设置报表样式,ReportDefine.RPT_NORMAL代表普通报表,ReportDefine.RPT_LINE代表行式报表
◆ PrintSetup打印设置类
PrintSetup ps = new PrintSetup();
ps.setBackGraphPrinted(false); //是否打印背景图
ps.setPaper(PrintSetup.A4_PAPERSIZE); //设置纸张大小为A4,类似的还有别的纸张尺寸,详看PrintSetup的帮助
ps. setBottomMargin(25); //设置下边距(mm),类似的还有设置上、下、左、右等边距
ps. setColTableHeaderAndFooterMode(PrintSetup.PRINT_FIRST_PAGE); //设置列表头和列表尾的打印方式, PrintSetup.PRINT_FIRST_PAGE代表只第一页打印,PrintSetup.PRINT_PER_PAGE代表每页都打
ps. setHAlign(PrintSetup. HALIGN_CENTER); //设置打印水平对齐位置,PrintSetup. HALIGN_CENTER代表水平居中,PrintSetup. HALIGN_LEFT代表水平居左,PrintSetup. HALIGN_RIGHT代表水平居右
ps. setLayout(PrintSetup.LAYOUT_COL); //设置按数据行数分页、一张纸打印多页时的打印顺序,PrintSetup.LAYOUT_COL代表先列后行,PrintSetup.LAYOUT_ROW代表先行后列
ps. setLayoutColNum(3); //设置按数据行数分页且每张纸打印多页(NxP)时,一张纸上的布局列数P
ps. setLayoutRowNum(2); //设置按数据行数分页且每张纸打印多页(NxP)时,一张纸上的布局行数N
ps. setOrientation(PrintSetup.LANDSCAPE); //设置纸张方向,PrintSetup.LANDSCAPE代表横向,PrintSetup.PORTRAIT代表竖向
ps. setPageHeaderAndFooterXMode(PrintSetup.PRINT_SPLITTED_FIRST_PAGE); //设置页眉与页脚横向分页时打印方式,PrintSetup.PRINT_SPLITTED_FIRST_PAGE代表仅首页打印切分部分,PrintSetup.PRINT_SPLITTED_FIRST_PAGE代表每页都打印切分部分,PrintSetup.PRINT_FIRST_PAGE代表只第一页打印,PrintSetup.PRINT_PER_PAGE代表每页都打
ps. setPageHeaderAndFooterYMode(PrintSetup.PRINT_SPLITTED_FIRST_PAGE); //设置页眉与页脚纵向分页时打印方式,PrintSetup.PRINT_FIRST_PAGE代表只第一页打印,PrintSetup.PRINT_PER_PAGE代表每页都打
ps. setPagerStyle(PrintSetup.PAGER_NONE); //设置分页方式,PrintSetup.PAGER_NONE代表不分页,PrintSetup.PAGER_ROW代表按行数分页,PrintSetup.PAGER_SIZE代表按纸张尺寸分页
ps. setPaperSize(360, 840); //设置自定义纸张大小mm
ps. setRowNumPerPage(5); //设置按数据行数分页时每页的数据行数
ps. setTableColumnNum(3); //设分栏数
ps. setTitleXMode(byte mode); //设置标题横向分页时打印方式,PrintSetup.PRINT_SPLITTED_FIRST_PAGE代表仅首页打印切分部分,PrintSetup.PRINT_SPLITTED_FIRST_PAGE代表每页都打印切分部分,PrintSetup.PRINT_FIRST_PAGE代表只第一页打印,PrintSetup.PRINT_PER_PAGE代表每页都打
ps. setTitleYMode(byte mode); //设置标题纵向分页时打印方式,PrintSetup.PRINT_FIRST_PAGE代表只第一页打印,PrintSetup.PRINT_PER_PAGE代表每页都打
ps. setVirtualPrinter(java.lang.String printerName); //设置虚拟打印机名,用于带表格线的文本报表打印
ps. setZoomMode(PrintSetup.ZOOM_NONE); //设置缩放打印方式,PrintSetup.ZOOM_BY_SCALE代表按指定比例缩放(需要填入缩放比例),PrintSetup.ZOOM_HEIGHT代表按高缩放,报表高度与纸高匹配,PrintSetup.ZOOM_NONE代表不缩放,PrintSetup.ZOOM_TO_PAGE代表缩放到指定的页数(需要填入几页宽,几页高),PrintSetup.ZOOM_WIDTH代表按宽缩放,报表宽度与纸宽匹配
rd.setPrintSetup( ps ); //将打印属性设置给ReportDefine
◆ PrintFrame打印对话框类:
PrintFrame pf=new PrintFrame(iReport,null); //iReport为计算后的报表,报表运算,参见2.1.1
pf.setColumns(2); //设置报表的分栏数
pf.setPrintablePages(1); //设置要打印的页号,可以多次调以设置多个页
pf.setPrintablePages(2,6); //设置要打印的连续页号 ,包括起始和终止页号
pf.setHorizontalAlign(PrintSetup.HALIGN_CENTER); //设置横向对齐方式,“PrintSetup.HALIGN_CENTER”表示居中; “PrintSetup.HALIGN_LEFT”表示居左; “PrintSetup.HALIGN_RIGHT”表示居右
PageFormat pageFormat=new PageFormat(); //定义描述打印页面方向和大小的对象
Paper paper=new Paper(); //定义一个新纸张对象
paper.setSize(684,792); //设置纸张的大小
paper.setImageableArea(100,100,594,702) ; //设置打印区域的大小
pageFormat.setPaper(paper); //为PageFormat对象设置Paper对象。
pf.setPrintPageFormat(pageFormat); //设置打印纸张的页面设置
pf. setPrintZoomType(PrintSetup.ZOOM_WIDTH); //设置打印时对报表的缩放类型,取值为: PrintSetup.ZOOM_NONE 表示不缩放;取值为:PrintSetup.ZOOM_WIDTH 表示按宽缩放,报表宽度与纸宽匹配;取值为:PrintSetup.ZOOM_HEIGHT 表示按高缩放,报表高度与纸高匹配;取值为:PrintSetup.ZOOM_BY_SCALE 表示按指定比例缩放(需要填入缩放比例)。
pf.setPrintZoomScale(100); //设置打印时对报表的缩放比例,该比例为百分数,例如100为原值大小。
pf.setDisplayScale(100); //设置预览报表时对报表的缩放比例,修改该比例仅影响显示,跟实际打印输出没有关系,该比例为百分数,例如100为原值大小。
pf.goToPage(1); //在当前的页面定义范围内设置要显示的页面,页号从1开始
pf.goToFirstPage(1); //设置当前定义范围内的首页
pf.goToLastPage (6); //设置当前定义范围内的末页
pf.goToPreviousPage (5); //设置当前定义范围内的前页
pf.goToNextPage (6); //设置当前定义范围内的后页
pf.getReportPane(); //获取显示报表的面板
pf.getPrinterJob(); //获取当前的打印任务对象,可以自己取消或者获取对象里面的任何有意义的信息。注意:只有调用了类似于Print的方法之后,该对象才不为null
pf.backgroundPrinting (); //直接在后台打印报表,不显示打印窗口,不选择打印机
pf.print(); //输出打印任务
pf.directPrint (true); //将报表直接发送到打印机进行打印,参数为true表示需要选择打印机,参数为false表示不需要选择打印机
导出
ExportConfig expConfig = new ExportConfig(); //新建导出属性
expConfig.setExcelHiddenColExported(false); //设导出到Excel时是否导出隐藏列
expConfig.setExcelHiddenRowExported(false); //设导出到Excel时是否导出隐藏行
expConfig.setExcelFilePassword("password"); //设置Excel文件的口令
expConfig.setPDFOwnerPassword("password"); //设置导出PDF文件时拥有者的口令
expConfig.setPDFAssembly(true); //设置导出PDF文件时是否允许文档汇编
expConfig.setPDFCopy(true); //设置导出PDF文件时是否允许复制
expConfig.setPDFDegradedPrinting(true); //设置导出PDF文件时是否允许打印
expConfig.setPDFFillIn(true); // 设置导出PDF文件时是否允许填写表格栏
expConfig.setPDFModifyAnnotations(true); //设置导出PDF文件时是否允许常规编辑、注释
expConfig.setPDFModifyContents(true); //设置导出PDF文件时是否允许更改文档
expConfig.setPDFScreenReaders(true); //设置导出PDF文件时是否启用视障人士内容访问
expConfig.setPDFUserPassword("password"); //设导出到PDF文件时的用户口令
expConfig.setWordPassword("password"); //设置Word文件的口令
rd.setExportConfig( expConfig); //将导出属性设置给ReportDefine
背景图
BackGraphConfig bgc = new BackGraphConfig(); //构造背景图属性
bgc.setDispMode(BackGraphConfig.DISP_PER_PAGE); //设置背景图显示方式
BackGraphConfig.DISP_PER_PAGE代表每页显示,BackGraphConfig.DISP_NONE代表不显示
bgc.setImageSource(BackGraphConfig.SOURCE_TEXT); //设置背景图的生成来源
BackGraphConfig.SOURCE_NONE代表不设置"空白",BackGraphConfig.SOURCE_PICTURE代表用"图片",BackGraphConfig.SOURCE_TEXT代表用"水印"
bgc.setType(BackGraphConfig.TYPE_URL); //设置背景图配置类型,
BackGraphConfig.TYPE_EXP代表表达式串,BackGraphConfig.TYPE_URL代表url 或文本
bgc.setValue("E:/files/pic.jpg"); //设置图片的URL或表达式串
参数type为TYPE_URL时此参数表示URL,为TYPE_EXP时此参数表示表达式串
bgc.setMode(BackGraphConfig.TEXT_NORMAL); //设置背景图片或水印的样式
图片样式:BackGraphConfig.MODE_NONE代表左上,BackGraphConfig.MODE_FILL代表填充,BackGraphConfig.MODE_TILE代表平铺
水印样式:BackGraphConfig.TEXT_NORMAL代表水平,BackGraphConfig.TEXT_TILT代表倾斜
bgc.setValue("raqsoft水印文字"); //设置水印的文本内容或表达式串
参数type为TYPE_URL时此参数表示文本,为TYPE_EXP时此参数表示表达式串
bgc.setFontName("黑体"); //设置水印文字的字体名
bgc.setFontSize(20); //设置水印文字的字号
bgc.setTextColor(165536); //设置水印文字的颜色值
bgc.setTransparency(10); //设置水印文字的透明度,值为0到100
bgc.setTextGap(60); //设置水印文字平铺时的文本间隔
rd.setBackGraphConfig( bgc ); //把背景图属性设置给ReportDefine
子报表
SubReportMetaData subReport = new SubReportMetaData(); //构造子报表元数据
SubReportConfig src = new SubReportConfig(); //构造子报表定义
src.setName("subReport1"); //设置子报表名称
src.setURLType(SubReportConfig.TYPE_ABSOLUTE); //设置子报表定义的URL类型为绝对路径
src.setURL("C:/abc.rpx"); //设置子报表的路径
subReport.addSubReportConfig(src); //把子报表定义添加到子报表元数据中
rd.setSubReportMetaData( subReport ); //把子报表元数据赋给ReportDefine
IRowCell rowcell=rd.getRowCell(1); //根据行号获得行首格
rowcell.setRowType(IRowCell.TYPE_TITLE_HEADER); //对行首格设置行类型
rowcell.setBreakPage(true); //设行后是否分页
rowcell.setBreakPageExp("1==1"); //设行后是否分页表达式
rowcell.setRowHeight(50); //设行高
rowcell.setRowHeightExp("100/2"); //设行高表达式
rowcell.setRowVisible(true); //设行是否可见
rowcell.setRowVisibleExp("2>1"); //设行是否可见的表达式
rowcell.setGroupHeaderLevel(1); //设组头级别
//IColCell colCell = rd.getColCell((short)1);
colCell.set…..//与设置行属性类似
设置合并格
Area area=new Area(1,(short)1,1,(short)3); //构造一个合并区域
try {
ReportUtils.mergeReport(rd,area); //将报表模板依据合并区域的定义执行合并操作
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
● 注意:合并后的单元格如果需要修改外观、数据值、对齐方式等属性,直接对首格设置即可,首格为左上角的单元格
设置边框、字体、颜色等外观属性
设置边框
for(int i=2;i<4;i++){
for(int j=1;j<4;j++){
rd.setBBColor(i,(short)j, -16763905); //设定下边框线色
rd.setBBStyle(i,(short)j, INormalCell.LINE_SOLID); //设定下边框类型
rd.setBBWidth(i,(short)j, (float) 0.75); //设定下边框线粗
//左边框
rd.setLBColor(i,(short)j, -16763905);
rd.setLBStyle(i,(short)j, INormalCell.LINE_SOLID);
rd.setLBWidth(i,(short)j, (float) 0.75);
//右边框
rd.setRBColor(i,(short)j, -16763905);
rd.setRBStyle(i,(short)j, INormalCell.LINE_SOLID);
rd.setRBWidth(i,(short)j, (float) 0.75);
//上边框
rd.setTBColor(i,(short)j, -16763905);
rd.setTBStyle(i,(short)j, INormalCell.LINE_SOLID);
rd.setTBWidth(i,(short)j, (float) 0.75);
}
}
设置单元格值、字体、字号、颜色、对齐等
INormalCell inc=rd.getCell(1,(short)1);
inc.setValue("雇员信息列表"); //设置单元格值
inc.setFontName("宋体"); //设置字体
inc.setFontSize((short)18); //设置字号
inc.setForeColor(-16777063); //设置前景色
inc.setHAlign(INormalCell.HALIGN_CENTER); //设置纵向对齐方式
设置单元格表达式
INormalCell inc4=rd.getCell(3,(short)1);
IByteMap map1=new ByteMap();
map1.put(INormalCell.VALUE,"ds1.select(雇员ID,false,雇员ID<@arg3)"); //设置单元格的数据值表达式
map1.put(......); //设置其他属性的表达式
inc4.setExpMap(map1);
ParamMetaData pmd=new ParamMetaData(); //构造参数元数据
Param param = new Param(); //构造参数定义
param.setParamName("arg1"); //设置参数名
param.setDataType(Types.DT_DATE); //设置参数数据类型
param.setParamType(Param.PARAM_NORMAL); //设置参数类型(普通参数或动态参数)
param.setValue("1958-01-01"); //设参数缺省值
Param param1 = new Param();
param1.setParamName("arg2");
param1.setDataType(Types.DT_DATE);
param1.setParamType(Param.PARAM_NORMAL);
param1.setValue("1978-01-01");
pmd.addParam(param); //把参数定义添加到参数元数据中
pmd.addParam(param1);
rd.setParamMetaData(pmd); //把参数元数据赋给ReportDefine
DataSetMetaData dsmd=new DataSetMetaData(); //构造数据集元数据
SQLDataSetConfig sdc=new SQLDataSetConfig(); //构造数据集定义
sdc.setName("ds1"); //设置数据集名
sdc.setSQL("SELECT 雇员.雇员ID,雇员.名字,雇员.职务 FROM 雇员 WHERE 雇员.出生日期 >? AND 雇员.出生日期 <?"); //设置sql语句
sdc.addParam(); //添加参数
sdc.addParam();
sdc.setParamExp(0,"arg1"); //设置参数
sdc.setParamExp(1,"arg2");
dsmd.addDataSetConfig(sdc); //把数据集定义添加到数据集元数据
rd.setDataSetMetaData(dsmd); //把数据集元数据赋给ReportDefine
try {
ReportUtils.write("E:/test.rpx",rd); //将ReportDefine保存到文件
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}