<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825594
    • 排名 - 49

    最新評論

    閱讀排行榜

    評論排行榜

    JFreeReport是由JFree組織開發的一個基于java的報表組件。利用JFreeReport組件可以完成大多數樣式的報表,并且能夠將其輸出
     為pdf、xls、cvs、html等不同格式的文件和打印,為程序開發人員解決報表問題提供了很大的方便。
    JFreeReport組件包括一個核心包以及幾個擴展包,可以到www.jfree.org網站下載。由于是開源的,所以可以直接得到其源代碼。
     (后面關于PDF輸出中文方面就需要修改其源代碼)
    現在JFreeReport加入到了Pentaho,所以JFreeReport的最新版本只到jfreereport-0.8.7-9.jar,之后就以Pentaho Report Designer命名了。
     
    二、JFreeReport組件的結構
    JFreeReport組件的核心對象就是JFreeReport對象,我將其視兩部分:一部分是報表格式定義,另一部分是數據存儲。
    JFreeReport組件的數據使用的是java.swing.table.TableModel類,我們對它都非常熟悉了,用JTable做表格時都會用到,所以在此不再累述。
     我主要講講JFreeReport的報表格式定義以及輸出方法。
    JFreeReport將報表分為以下幾個部分:
     報頭(ReportHeader)、
     報尾(ReportFooter)、
     頁頭(PageHeader)、
     頁尾(PageFooter)、
     分組頭(GroupHeader)、
     分組尾(GroupFooter)和數據域。
    l     表頭(ReportHeader)——內容顯示在整個報表的開頭,可以包括報表名稱等內容。
    l     表尾(ReportFooter)——內容顯示在整個報表的末尾。
    l     頁首(PageHeader)——內容顯示在每一頁的首部,第一頁則顯示在ReportHeader下面,可以包括報表日期、填表人等內容。
    l     頁尾(PageFooter)——內容顯示在每一頁的末尾,可以包括頁號等信息。
    l     分組頭(GroupHeader)——如果將數據分組,則GroupHeadar內容會顯示在每一組分組的頭部。
    l     分組尾(GroupFooter)——如果將數據分組,則GroupHeadar內容會顯示在每一組分組的頭部。
    l     數據域——報表數據,一般位于每頁的中間部分。
     
    三、報表格式定義
    知道了JFreeReport組件的報表結構,下面該介紹如何定義了。有兩種方法:一種是使用java代碼實現,另一種是使用xml定義。
    1、代碼方式實現報表格式定義
    使用代碼方式實現步驟很簡單,就是分別構造報頭(ReportHeader)、報尾(ReportFooter)、頁頭(PageHeader)、頁尾(PageFooter)、
     分組頭(GroupHeader)和分組尾(GroupFooter)對象,然后使用set方法加入JFreeReport對象就可以了。
    上面這幾個對象我們一般只會用到其addElement(Element element)方法,即將一個元素(Element)加入到指定部分。在這里,元素的意義
    就是顯示在報表中的內容,包括文本、表格、圖形、圖片等等。Element是一個抽象類,他有幾個子類,但我們不必直接使用這些子類,
    而是通過org.jfree.report.elementfactory包中的工廠類來構建。:
    l     LabelElementFactory——標簽元素工廠類,定義報表中顯示的固定文本內容。
    l     TextElementFactory——文本元素工廠類,根據定義的域名,顯示其域名下的內容。比如:tableModel中的“編號”字段下的內容。
    l     StaticShapeElementFactory——圖形元素類,可以繪制直線、矩形等圖形。
    其他的元素我沒用過,大家可以查看JFreeReport的API文檔。他們的用法請看下面的例子。
      public static final int ROW_HEIGHT = 20;    //報告:行高度
            public static final int HEADER_HEIGHT = 40;    //報告:報頭高度
           JFreeReport report = new JFreeReport();    //構造JFreeReport對象
           report.setName("Report Name");
           PageDefinition pd = report.getPageDefinition();    //取得報告頁面定義
           float pageWidth = pd.getWidth();    //取得打印材質的頁寬
     
           //定義頁頭
           PageHeader header = new PageHeader();
           LabelElementFactory title = new LabelElementFactory();    //標題元素
           title.setText("統計報表");    //設置文本內容
           title.setColor(Color.BLACK);    //設置顏色
           title.setAbsolutePosition(new Point2D.Float(0, HEADER_HEIGHT));    //設置顯示位置
           title.setMinimumSize(new FloatDimension(pageWidth, 36));    //設置尺寸
           title.setHorizontalAlignment(ElementAlignment.LEFT);
           title.setVerticalAlignment(ElementAlignment.MIDDLE);
           title.setDynamicHeight(true);    //設置是否動態調整高度(如果為true,當文本內容超出顯示范圍時高度自動加長)
           header.addElement(title.createElement());
           report.setPageHeader(header);
     
           String[] columnNames = getColumnNames();    //取得報表數據域的所有列名
     
        if (columnNames != null && columnNames.length > 0) ...{
              report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));    //繪制表格的橫線
               //定義報表頭
               ReportHeader reportHeader = new ReportHeader();
            for (int i = 0; i < columnNames.length; i++) ...{
                  //字段名元素
                  LabelElementFactory col = new LabelElementFactory();
                  col.setName(columnNames[i]);
                  col.setColor(Color.BLACK);
                  col.setHorizontalAlignment(ElementAlignment.CENTER);
                  col.setVerticalAlignment(ElementAlignment.MIDDLE);
                  col.setDynamicHeight(true);
                  col.setAbsolutePosition(new Point2D.Float((pageWidth
                         / (columnNames.length))
                         * i, 0));
                  col.setMinimumSize(new FloatDimension(pageWidth
                         / (columnNames.length), ROW_HEIGHT));    //設置最小尺寸
                  col.setBold(true);    //設置是否粗體顯示
                  col.setText(columnNames[i]);
                  reportHeader.addElement(col.createElement());
                  reportHeader.addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), col.getAbsolutePosition().getX()));    //元素左側豎線
                  reportHeader.addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));    //元素上方橫線
                  reportHeader.addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), pageWidth));    //元素右側豎線
                  report.setReportHeader(reportHeader);
                 
                  //字段內容元素
                  TextFieldElementFactory data = new TextFieldElementFactory();
                  data.setName(columnNames[i]);
     
                  data.setColor(Color.BLACK);
                  data.setAbsolutePosition(new Point2D.Float((pageWidth
                         / (columnNames.length))
                         * i, 0));
                  data.setMinimumSize(new FloatDimension(pageWidth
                         / (columnNames.length), ROW_HEIGHT));
                  data.setHorizontalAlignment(ElementAlignment.CENTER);
     
                  data.setVerticalAlignment(ElementAlignment.MIDDLE);
                  data.setDynamicHeight(true);
                  data.setWrapText(new Boolean(true));
                  data.setNullString("-");    //如果字段內容為空,顯示的文本
                  data.setFieldname(columnNames[i]);
                   report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));
                  report.getItemBand().addElement(data.createElement());
                   report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), -100));
                   report.getItemBand().addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), data.getAbsolutePosition().getX()));
                   report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));
               }// end for(int i=0;i<columnNames.length;i++)
              
               //最后的豎線
               report.getItemBand().addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), pageWidth));
              
               PageFooter footer = new PageFooter();
              
               //設置頁號
               PageOfPagesFunction pageFunction = new PageOfPagesFunction("PAGE_NUMBER");    //構造一個頁號函數對象
               pageFunction.setFormat("{0} / {1}頁");    //設置頁號顯示格式(此處顯示的格式為“1/5頁”)
               report.addExpression(pageFunction);
              
               TextFieldElementFactory pageCount = new TextFieldElementFactory();
               pageCount.setFieldname("PAGE_NUMBER");
               pageCount.setColor(Color.black);
               pageCount.setAbsolutePosition(new Point2D.Float(0, 0));
               pageCount.setMinimumSize(new FloatDimension(pageWidth, 0));
               pageCount.setHorizontalAlignment(ElementAlignment.RIGHT);
               pageCount.setVerticalAlignment(ElementAlignment.MIDDLE);
               pageCount.setDynamicHeight(true);
               footer.addElement(pageCount.createElement());
               report.setPageFooter(footer);
              
               ReportFooter reportFooter = new ReportFooter();
               reportFooter.addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));
               report.setReportFooter(reportFooter);
     
    2、XML方式實現報表格式定義
    對于簡單的報表,我們可以使用代碼來實現,但對于復雜的報表,代碼可能就無能為力了
     (雖然也可以實現,但對于讀代碼的人來說可能將是場災難),那么我們就可以通過定義XML來實現報表格式的定義。
     這種方法非常方便而且清晰。
    JFreeReport定義了兩種XML實現方法。這里我只介紹一種,因為另一種我沒有用過。我直接通過例子來解釋如何實現:
    <?xml version="1.0" encoding="GB2312"?>
    <report name="My Report" pageformat="A4" leftmargin="40" rightmargin="40">
      <configuration>
        <property name="com.jrefinery.report.preview.PreferredWidth">1024</property>
        <property name="com.jrefinery.report.preview.PreferredHeight">768</property>
      </configuration>
       
      <!-- 報頭  -->
      <reportfooter height="20" fontname="宋體" fontsize="12">
      </reportfooter>
       
      <!-- 頁首  -->
      <pageheader fontname="宋體" fontsize="12">
        <!-- 文本域,用于顯示表數據中某列的內容  -->
        <!-- x,y: 為坐標點(以頁首區域的左上角為(0, 0)點)  -->
        <!-- width, height: 為文本域的寬度和高度,如果為數值則表示為絕對尺寸,如果為百分數,則自動以百分比方式調整尺寸大小  -->
        <!-- alignment: 排列方式 -->
        <!-- fieldname: 域名,即數據域的列名 -->
        <!-- nullstring: 當數據域內容為空時顯示的字符串內容 -->
        <!-- alignment: 水平排列方式center,left或right -->
        <!-- vertical-alignment: 豎直排列方式top、middle或bottom -->
        <!-- dynamic: 是否動態調整單元格高度,如果為true,當文本內容不足以在當前尺寸中顯示時將自動增加單元格高度 -->
        <string-field x="0" y="0" width="100%" height="30" alignment="center" fontname="黑體" fontsize="15" fieldname="report.title" nullstring=""></string-field>
       
        <!-- 標簽域,用于在報表中顯示固定文本內容  -->
        <label x="0" y="20" width="100%" height="20" alignment="center" fontname="黑體" fontsize="15">報表</label>
            
        <label x="5%" y="80" width="100%" height="20" alignment="left">統計時間:</label>
        <string-field x="90" y="80" width="30%" height="18" alignment="left" fieldname="report.time" nullstring=""/>
        
        <label x="70%" y="80" width="100%" height="20">統計日期:</label>
       
        <!-- 時間域,用于顯示時間  -->
        <!-- report.date: 下面<function>中定義的函數,顯示當前時間 -->
        <!-- format: 日期格式 -->
        <date-field fieldname="report.date" format="yyyy/M/d" x="0%" y="80" width="95%" height="20" alignment="right"></date-field>
      </pageheader>
       
      <!-- 頁尾  -->
      <pagefooter height="20" fontname="宋體" fontsize="12">
        <string-field fieldname="pageXofY" x="0" y="4" width="100%" height="18" alignment="right"/>
      </pagefooter>
       
      <!-- 分組  -->
      <groups>
        <group name="group1">
          <!-- 分組頭 -->
          <groupheader fontname="宋體" fontsize="10.5">
            <label x="0%" y="5" width="20%" height="40" alignment="center" vertical-alignment="middle"> 結  論 </label>
            <rectangle x="0%" y="0" width="20%" height="50" color="#000000" draw="true" fill="false"/>
                   
            <label x="20%" y="5" width="40%" height="20" alignment="center" vertical-alignment="middle">上 年 度</label>
           
            <!-- 圖形:矩形 -->
            <!-- color: 顏色 -->
            <!-- fill: 是否填充 -->
            <rectangle x="20%" y="0" width="40%" height="25" color="#000000" draw="true" fill="false"/>       
            <label x="20%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle">人 數</label>
            <rectangle x="20%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/>
            <label x="40%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle">占比(%)</label>
            <rectangle x="40%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/>
            <label x="60%" y="5" width="40%" height="20" alignment="center" vertical-alignment="middle">本 年 度</label>
            <rectangle x="60%" y="0" width="40%" height="25" color="#000000" draw="true" fill="false"/>
            <label x="60%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle">人 數</label>
            <rectangle x="60%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/>
            <label x="80%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle">占比(%)</label>
            <rectangle x="80%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/>
          </groupheader>
          <!-- 可以還有分組尾<groupfooter> -->
        </group>
      </groups>
       
      <!-- 數據域  -->
      <items fontname="宋體" fontsize="12"> 
       
        <!-- 圖形:直線 -->
        <line x1="0" y1="0" x2="0" y2="100%"/>
           
        <string-field fieldname="年度體檢結論" x="0%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/>
        <line x1="20%" y1="0" x2="20%" y2="100%"/><!-- 結論 -->
        <string-field fieldname="上年度" x="20%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/>
        <line x1="40%" y1="0" x2="40%" y2="100%"/><!-- 上年度人數 -->
        <string-field fieldname="上年度(%)" x="40%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/>
        <line x1="60%" y1="0" x2="60%" y2="100%"/><!-- 上年度占比 -->
        <string-field fieldname="本年度" x="60%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/>
        <line x1="80%" y1="0" x2="80%" y2="100%"/><!-- 本年度人數 -->
        <string-field fieldname="本年度(%)" x="80%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/>
        <line x1="100%" y1="0" x2="100%" y2="100%"/><!-- 本年度占比 -->
           
        <line x1="0" y1="100%" x2="100%" y2="100%"/>       
      </items>
       
      <!-- 函數定義  -->
      <functions>
         <!-- 顯示當前時間的函數用法  -->
        <property-ref name="report.date"/>

        <!-- 顯示當前頁碼的函數用法 -->
        <function name="PageNumber" class="org.jfree.report.function.PageFunction" deplevel="1"/>

        <!-- 顯示總頁數的函數用法 -->
        <function name="PageTotal" class="org.jfree.report.function.PageTotalFunction" deplevel="1"/>
       
        <!-- 表達式,次表達式定義一個顯示頁碼格式的用法 -->
        <expression name="pageXofY" class="org.jfree.report.function.TextFormatExpression">
          <properties>
            <property name="pattern">{0}/{1}頁</property>
            <property name="field[0]">PageNumber</property>
            <property name="field[1]">PageTotal</property>
          </properties>
        </expression>
      </functions>
    </report>
     另一種方法我沒有用過,以后了解了再補充。
    四、輸出
    定義完JFreeReport對象,就可以進行輸出了。下面介紹幾種輸出方法。
    1、通過預覽窗口對象輸出
    該方式只能在Application環境中使用。通過預覽窗口,用戶可以自行選擇打印、排版或生成各種格式的文件,這也是我們在Application中常用的方式。代碼示例如下:
    PreviewDialog preview = null;    //預覽窗口對象
      try ...{
               // 將生成的報表放到預覽窗口中
               preview = new PreviewDialog(report);
           } catch (ReportProcessingException e) ...{
               e.printStackTrace();
           }
     
       if (preview != null) ...{
               preview.pack();
               preview.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
               // 設置報表起始點及長寬
               preview.setLocation(new Point(0, 0));
               Dimension screen = getToolkit().getScreenSize();
               int width = (int) (screen.getWidth() - 2 * preview.getLocation().x);
               int height = (int) (screen.getHeight());
               preview.setSize(new Dimension(width, height));
     
               // 顯示報表預覽窗口
               preview.setVisible(true);
               preview.requestFocus();
               // preview.addWindowListener(new CloseHandler());
           }

    2、輸出HTML文本。
    這種方法可以將報表輸出為HTML語言形成的文本,這種方式適用于在瀏覽器中顯示報表內容。示例代碼如下:
    ByteArrayOutputStream bo = null;
          StreamHtmlFilesystem filesystem = null;
           try ...{
               // 生成Html
               bo = new ByteArrayOutputStream();
               final HtmlProcessor processor = new HtmlProcessor(report);
               processor.setGenerateBodyFragment(true);
               processor.setEncoding ("UTF-8");
               filesystem = new StreamHtmlFilesystem(bo);
               processor.setFilesystem(filesystem);
               processor.processReport();
               String htmlCode = new String(bo.toByteArray(), "UTF-8");
               bo.close();
               bo = null;
               filesystem.close();
               filesystem = null;
           } catch(FileNotFoundException e) ...{
               e.printStackTrace();
           } catch(SecurityException e) ...{
               e.printStackTrace();
           } catch (ReportProcessingException e) ...{
               e.printStackTrace();
           } catch (IOException e) ...{
               e.printStackTrace();
           }
    3、輸出PDF文件
    PDF的輸出方式跟HTML的差不多,但有一點,JFreeReport本身無法輸出中文字符,如果想要輸出中文,我沒有找到更好的方法,所以更改了JFreeReport包中org.jfree.report.modules.output.support.itext.BaseFontSupport類的源碼,將
    final BaseFont f = BaseFont.createFont(BaseFont.HELVETICA, stringEncoding, embedded,
    false, null, null)中的BaseFont.HELVETICA改為“STSong-Light”,另外需要到www.lowagie.com/iText網站下載iText.jar包以支持STSong-Light字體編碼,這樣,就可以輸出中文了。示例代碼如下所示:
    這里注意,必須將target的字體編碼設為“UniGB-UCS2-H”而且使用Java1.5進行編譯
           PDFOutputTarget target = null;
       try ...{
               //生成pdf
               FileOutputStream fos = new FileOutputStream("PDF.pdf");
               target = new PDFOutputTarget(fos);
               target.configure(report.getReportConfiguration());
               target.setFontEncoding("UniGB-UCS2-H");
               target.open();
       
               final PageableReportProcessor proc = new PageableReportProcessor(report);
               proc.setOutputTarget(target);
               proc.processReport();
               target.close();  
               target = null;
           } catch(FileNotFoundException e) ...{
               e.printStackTrace();
           } catch(SecurityException e) ...{
               e.printStackTrace();
           } catch (OutputTargetException e) ...{
               e.printStackTrace();
           } catch (ReportProcessingException e) ...{
               e.printStackTrace();
           }

    以上就是我對JFreeReport組件的總結,寫的不好希望對大家有所
     


    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2056738



    posted on 2008-04-02 19:33 Ke 閱讀(2209) 評論(0)  編輯  收藏 所屬分類: JFreereport

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品~无码抽插| 毛片在线免费视频| 中国好声音第二季免费播放| 污视频网站在线免费看| 深夜a级毛片免费无码| 猫咪免费观看人成网站在线| 特级毛片aaaa级毛片免费| 国产成人综合亚洲| 黄色a级片免费看| 72pao国产成视频永久免费| 国产成人精品免费视频大全| 在线观看免费视频一区| 日本免费A级毛一片| 日本卡1卡2卡三卡免费| 亚洲毛片在线免费观看| 麻豆一区二区免费播放网站 | 亚洲国产一区在线观看| 亚洲人xxx日本人18| 亚洲av日韩av永久无码电影| 添bbb免费观看高清视频| 香蕉视频在线免费看| 欧洲精品99毛片免费高清观看 | 亚洲AV无码一区二区三区久久精品 | 免费一本色道久久一区| 免费爱爱的视频太爽了| 亚洲国产a级视频| 亚洲AV永久无码精品| 亚洲w码欧洲s码免费| 久久精品熟女亚洲av麻豆| 51午夜精品免费视频| 久久99国产综合精品免费| 成人免费视频77777| 无码不卡亚洲成?人片| 国产av无码专区亚洲av桃花庵| 91亚洲导航深夜福利| 亚洲av无一区二区三区| 中国在线观看免费的www| 一级女人18毛片免费| 免费在线观看你懂的| 亚洲国产人成在线观看69网站| 亚洲综合一区国产精品|