您的位置:首页 > 编程语言 > Java开发

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没法弄成左,中,右的情况了。如果大家有更好的办法,还望提出来。

以上经过我个人的测试是正常的,我利用这个方法去动态创建了几张不同列数的报表,在布局上,是符合要求的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐