java实现ireport动态报表导出与国际化
2013-08-13 17:15
113 查看
1、国际化:
ireport的国际化比较简单,用iReport-Professional-5.0.0打开*.jrxml文件,然后在report inspector视图下的文件右键,选择properties,在弹出的窗口中,resource bundle填上已经写好的资源文件的存放路径,就ok了。如图:
资源文件最好是放在*.jrxml文件同目录下,这样的话,就不用前面的相对路径了。另外在资源文件的命名上,有些讲究。我们先看下jaspersoft是如何获取资源文件的:
首先jaspersoft会根据Locale获取系统默认的语言,然后根据上面配好的路径和文件名加上语言去寻找资源文件:如Locale取到的是"zh","CN",配置的路径和文件名如上,则系统会优先去系统根目录下com/zk/common/local下寻找exportTemplate_zh_CN.properties文件,若找不到会在同目录下找exportTemplate.properties文件。看到这,大家就该知道怎么命名了。
命名之后,在测国际化的时候,需要在代码里面设置locale的值
Locale local = Locale.getDefault();
local.setDefault(new Locale("en","US"));
这样设置之后,才能保证国际化改动了。之前我们系统用的改变国际化改的是session,所以没测成功,后来才发现这个的。
2、动态导出通用报表
怎么利用ireport去创建一张新的报表我就不说了,网上很多资料的说。。。。。。
在这里,我报表中的列和表名都是动态生成的,由于部分原因(后面会讲),页头和页尾是创建好的。以下是我设计好的报表:
通过JRXmlLoader来加载.jrxml文件
JasperDesign jasperDesign = new JasperDesign();
jasperDesign = JRXmlLoader.load(new File(xmlPath));
然后设置报表的长度和高度(针对分页的每页的高度)
jasperDesign.setPageWidth(pageWidth);
jasperDesign.setPageHeight(pageHeight);
接着动态生成表名:
//表头title
JRDesignBand title = (JRDesignBand)jasperDesign.getTitle();
JRDesignStaticText titleStaticText = new JRDesignStaticText();
titleStaticText.setPdfEncoding("UniGB-UCS2-H");
titleStaticText.setPdfFontName("STSong-Light");
titleStaticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
titleStaticText.setFontSize(14);
titleStaticText.setHeight(20);
titleStaticText.setWidth(pageWidth - 80);
titleStaticText.setFontName("SansSerif");
titleStaticText.setBold(true);
titleStaticText.setText(“xxxx”);
title.addElement(titleStaticText);
再来动态生成列头和记录
//列头和记录
JRDesignBand columnHeader = (JRDesignBand)jasperDesign.getColumnHeader(); //列头
JRSection detail = jasperDesign.getDetailSection(); //详细记录
//需要先定义变量,好为后面jaspertsoft能够自动填充数据。name其实就是属性名,valueClass是对应的对象类型如String.class
JRDesignField field = new JRDesignField();
field.setName(“xxx”);
for (Field f : fields)
{
field.setValueClass(class);
}
jasperDesign.addField(field);
//列头
JRDesignStaticText jDesignStaticText = new JRDesignStaticText();
jDesignStaticText.setWidth(78);
jDesignStaticText.setHeight(20);
jDesignStaticText.setPdfFontName("STSong-Light");
jDesignStaticText.setText("这里是需要显示的列头的名字,如“姓名”");
jDesignStaticText.setBackcolor(new Color(153,204,255));
jDesignStaticText.setPdfEncoding("UniGB-UCS2-H");
jDesignStaticText.setStyle(new JRBaseStyle("table_TH"));
jDesignStaticText.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
jDesignStaticText.setX(78 * i);
columnHeader.addElement(jDesignStaticText);
//详细记录
JRDesignBand jRDesignBand = (JRDesignBand)detail.getBands()[0];
JRDesignTextField jRDesignTextField = new JRDesignTextField();
jRDesignTextField.setPdfEncoding("UniGB-UCS2-H");
jRDesignTextField.setWidth(78);
jRDesignTextField.setHeight(20);
jRDesignTextField.setPdfFontName("STSong-Light");
jRDesignTextField.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
jRDesignTextField.setStyle(new JRBaseStyle("table_TD"));
jRDesignTextField.setX(78 * i);
jRDesignTextField.setBlankWhenNull(true);
jRDesignTextField.setStretchWithOverflow(true);
jRDesignTextField.setPrintRepeatedValues(true);
jRDesignTextField.setStretchType(StretchTypeEnum.RELATIVE_TO_TALLEST_OBJECT);
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{"+"这里填的必须是前面提到的属性名"+"}");
expression.setValueClass(valueClass);//然后这里是对应的对象类型
到这里,就是整个column header和detail的设置,大家想要几列就循环几次就好了,不过记得对应的地方要改。
最后,设置页尾,在这里是页码的位置:
JRDesignBand pageFooter = (JRDesignBand)jasperDesign.getPageFooter();
JRDesignTextField pageFooter1 = (JRDesignTextField)pageFooter.getElementByKey("pageFooter1");
pageFooter1.setWidth(pageWidth - 380);
pageFooter1.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
JRDesignTextField pageFooter2 = (JRDesignTextField)pageFooter.getElementByKey("pageFooter2");
pageFooter2.setWidth(pageWidth - 385);
pageFooter2.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
两个key是对应的报表在pageFooter底下的两个text field。
完成这些后,就可以用JasperCompileManager.compileReport()方法编译生成.jsper文件了,后面的网上也有说,我就不贴出来了,就是根据某种类型去转。
这里要跟大家交代的是报表我至今都找不到怎么去设置某个textField相对于title(pageHeader之类的)的相对布局,也就是居中,居左,居右等,但我找到个替代的办法,
就是当你要设置表名居中时,你可以设置表名的textField的宽度跟报表的宽度一样,然后调用titleStaticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);就可以了。。。。当然这种方法有缺陷。。。这也就是为什么pageHeader里面的三个textField没法弄成左,中,右的情况了。如果大家有更好的办法,还望提出来。
以上经过我个人的测试是正常的,我利用这个方法去动态创建了几张不同列数的报表,在布局上,是符合要求的。
ireport的国际化比较简单,用iReport-Professional-5.0.0打开*.jrxml文件,然后在report inspector视图下的文件右键,选择properties,在弹出的窗口中,resource bundle填上已经写好的资源文件的存放路径,就ok了。如图:
资源文件最好是放在*.jrxml文件同目录下,这样的话,就不用前面的相对路径了。另外在资源文件的命名上,有些讲究。我们先看下jaspersoft是如何获取资源文件的:
首先jaspersoft会根据Locale获取系统默认的语言,然后根据上面配好的路径和文件名加上语言去寻找资源文件:如Locale取到的是"zh","CN",配置的路径和文件名如上,则系统会优先去系统根目录下com/zk/common/local下寻找exportTemplate_zh_CN.properties文件,若找不到会在同目录下找exportTemplate.properties文件。看到这,大家就该知道怎么命名了。
命名之后,在测国际化的时候,需要在代码里面设置locale的值
Locale local = Locale.getDefault();
local.setDefault(new Locale("en","US"));
这样设置之后,才能保证国际化改动了。之前我们系统用的改变国际化改的是session,所以没测成功,后来才发现这个的。
2、动态导出通用报表
怎么利用ireport去创建一张新的报表我就不说了,网上很多资料的说。。。。。。
在这里,我报表中的列和表名都是动态生成的,由于部分原因(后面会讲),页头和页尾是创建好的。以下是我设计好的报表:
通过JRXmlLoader来加载.jrxml文件
JasperDesign jasperDesign = new JasperDesign();
jasperDesign = JRXmlLoader.load(new File(xmlPath));
然后设置报表的长度和高度(针对分页的每页的高度)
jasperDesign.setPageWidth(pageWidth);
jasperDesign.setPageHeight(pageHeight);
接着动态生成表名:
//表头title
JRDesignBand title = (JRDesignBand)jasperDesign.getTitle();
JRDesignStaticText titleStaticText = new JRDesignStaticText();
titleStaticText.setPdfEncoding("UniGB-UCS2-H");
titleStaticText.setPdfFontName("STSong-Light");
titleStaticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
titleStaticText.setFontSize(14);
titleStaticText.setHeight(20);
titleStaticText.setWidth(pageWidth - 80);
titleStaticText.setFontName("SansSerif");
titleStaticText.setBold(true);
titleStaticText.setText(“xxxx”);
title.addElement(titleStaticText);
再来动态生成列头和记录
//列头和记录
JRDesignBand columnHeader = (JRDesignBand)jasperDesign.getColumnHeader(); //列头
JRSection detail = jasperDesign.getDetailSection(); //详细记录
//需要先定义变量,好为后面jaspertsoft能够自动填充数据。name其实就是属性名,valueClass是对应的对象类型如String.class
JRDesignField field = new JRDesignField();
field.setName(“xxx”);
for (Field f : fields)
{
field.setValueClass(class);
}
jasperDesign.addField(field);
//列头
JRDesignStaticText jDesignStaticText = new JRDesignStaticText();
jDesignStaticText.setWidth(78);
jDesignStaticText.setHeight(20);
jDesignStaticText.setPdfFontName("STSong-Light");
jDesignStaticText.setText("这里是需要显示的列头的名字,如“姓名”");
jDesignStaticText.setBackcolor(new Color(153,204,255));
jDesignStaticText.setPdfEncoding("UniGB-UCS2-H");
jDesignStaticText.setStyle(new JRBaseStyle("table_TH"));
jDesignStaticText.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
jDesignStaticText.setX(78 * i);
columnHeader.addElement(jDesignStaticText);
//详细记录
JRDesignBand jRDesignBand = (JRDesignBand)detail.getBands()[0];
JRDesignTextField jRDesignTextField = new JRDesignTextField();
jRDesignTextField.setPdfEncoding("UniGB-UCS2-H");
jRDesignTextField.setWidth(78);
jRDesignTextField.setHeight(20);
jRDesignTextField.setPdfFontName("STSong-Light");
jRDesignTextField.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
jRDesignTextField.setStyle(new JRBaseStyle("table_TD"));
jRDesignTextField.setX(78 * i);
jRDesignTextField.setBlankWhenNull(true);
jRDesignTextField.setStretchWithOverflow(true);
jRDesignTextField.setPrintRepeatedValues(true);
jRDesignTextField.setStretchType(StretchTypeEnum.RELATIVE_TO_TALLEST_OBJECT);
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{"+"这里填的必须是前面提到的属性名"+"}");
expression.setValueClass(valueClass);//然后这里是对应的对象类型
到这里,就是整个column header和detail的设置,大家想要几列就循环几次就好了,不过记得对应的地方要改。
最后,设置页尾,在这里是页码的位置:
JRDesignBand pageFooter = (JRDesignBand)jasperDesign.getPageFooter();
JRDesignTextField pageFooter1 = (JRDesignTextField)pageFooter.getElementByKey("pageFooter1");
pageFooter1.setWidth(pageWidth - 380);
pageFooter1.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
JRDesignTextField pageFooter2 = (JRDesignTextField)pageFooter.getElementByKey("pageFooter2");
pageFooter2.setWidth(pageWidth - 385);
pageFooter2.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
两个key是对应的报表在pageFooter底下的两个text field。
完成这些后,就可以用JasperCompileManager.compileReport()方法编译生成.jsper文件了,后面的网上也有说,我就不贴出来了,就是根据某种类型去转。
这里要跟大家交代的是报表我至今都找不到怎么去设置某个textField相对于title(pageHeader之类的)的相对布局,也就是居中,居左,居右等,但我找到个替代的办法,
就是当你要设置表名居中时,你可以设置表名的textField的宽度跟报表的宽度一样,然后调用titleStaticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);就可以了。。。。当然这种方法有缺陷。。。这也就是为什么pageHeader里面的三个textField没法弄成左,中,右的情况了。如果大家有更好的办法,还望提出来。
以上经过我个人的测试是正常的,我利用这个方法去动态创建了几张不同列数的报表,在布局上,是符合要求的。
相关文章推荐
- Java使用POI实现数据导出excel报表
- Java使用POI实现数据导出excel报表
- jasperReport+ireport实现报表导出和数据分析
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表
- JAVA将Excel中的报表导出为图片格式(二)实现思路
- excel导出时 如何根据java后台返回的结果 动态实现excel复选框的勾选
- ireport+jsp基于jasperReport 实现(后台map数据源)导出报表至web页面 二
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表
- Atitit.导出excel报表的设计与实现java .net php 总结
- Java程序员从笨鸟到菜鸟之(一百零五)java操作office和pdf文件(三)利用jxl实现数据导出excel报表以及与POI的区别
- Java使用POI实现数据导出excel报表
- Java程序员从笨鸟到菜鸟之(一百零五)java操作office和pdf文件(三)利用jxl实现数据导出excel报表以及与POI的区别
- Java 使用 iReport 导出报表
- ireport+jsp基于jasperReport 实现(后台map数据源)导出报表至web页面
- Java使用POI实现数据导出excel报表
- 用ireport设计报表,通过jasper实现pdf导出及打印
- [Jasper使用总结]iReport报表设计-动态列实现
- Java使用POI实现数据导出excel报表
- 详解JAVA POI导出EXCEL报表的操作(包括各种格式及样式的实现)
- Atitit.导出excel报表的设计与实现java .net php 总