java实现ireport动态报表导出与国际化
来源:互联网 发布:重庆seo入门基础教程 编辑:程序博客网 时间:2024/05/17 08:41
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没法弄成左,中,右的情况了。如果大家有更好的办法,还望提出来。
以上经过我个人的测试是正常的,我利用这个方法去动态创建了几张不同列数的报表,在布局上,是符合要求的。
- java实现ireport动态报表导出与国际化
- 导出报表 ireport 与 poi
- Java 使用 iReport 导出报表
- JasperDesign+ireport动态报表实现
- JasperReport + iReport 实现Java报表套打
- iReport动态报表
- jasperReport+ireport实现报表导出和数据分析
- [Jasper使用总结]iReport报表设计-动态列实现
- [Jasper使用总结]iReport报表设计-动态列实现
- ireport 打印 报表 java
- java + ireport生成报表
- ireport自定义动态创建报表
- Ireport动态导出pdf,xml
- Ireport+Jasperreport实现报表使用
- 报表 ireport 基于Servlet实现
- ireport+springmvc实现报表预览
- ireport报表导出 pdf xls doc
- JasperReporter Ireport Java 打印报表
- 安装1394相机 How to Connect to an IEEE 1394 Camera
- vs2010MFC工程,遇到的堆已损坏的崩溃。产生可能性,以及解决方案
- 16款加速编码的HTML5在线工具
- SurfaceFlinger旋转流程分析
- hdu 3007 Buried memory(water)
- java实现ireport动态报表导出与国际化
- C# Stopwatch类用法
- 一步一步学android之布局管理器——FrameLayout
- bootmem allocator分析
- KMP算法详解
- 随手笔记之VC++(四)
- 设计模式2 观察者模式
- 外在化应用参数的配置 spring <context:property-placeholder location="" />
- iOS 的 IAP 教程