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

以上经过我个人的测试是正常的,我利用这个方法去动态创建了几张不同列数的报表,在布局上,是符合要求的。

原创粉丝点击