java實現ireport動態報表導出與國際化

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沒法弄成左,中,右的情況了。如果大家有更好的辦法,還望提出來。

以上經過我個人的測試是正常的,我利用這個方法去動態創建了幾張不同列數的報表,在佈局上,是符合要求的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章