用JFreeChart統計報表

 

需要包: jcommon-1.0.16.jar、jfreechart-1.0.13.jar

 

1. 創建圖表工具類 JFreeChartUtils.java

package com.pcm.fnd.util;

import java.awt.Color;
import java.awt.Font;
import java.text.DecimalFormat;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;

/**
 * 創建圖表工具類
 * @author qiyh
 * @date 2011-08-10
 *
 */
public class JFreeChartUtils {

 /**
   * 折線圖
   * @param chartTitle:
   *    標題
   * @param showX:
   *   X軸顯示的說明文字
   * @param showY:
   *   Y軸顯示的說明文字
   * @param xyDataset:
   *   數據集
   * @param maxrange:
   *   Y軸最大值
   * @param showCornerValue:
   *         是否在拐點數據值
   * @return JFreeChart
   */
   public static JFreeChart createLineXYChart(String chartTitle, String showX, String showY,
           CategoryDataset xyDataset, double maxrange, boolean showCornerValue) {

       JFreeChart chart = ChartFactory.createLineChart(chartTitle, showX, showY,
               xyDataset, PlotOrientation.VERTICAL, true, true, false);

//       chart.setTextAntiAlias(false);
       // 設置背景
       chart.setBackgroundPaint(Color.WHITE);
       // 設置標題title
       Font font = new Font("隸書", Font.PLAIN, 25);
       TextTitle title = new TextTitle(chartTitle);
       title.setFont(font);
       chart.setTitle(title);
      
       // 設置面板字體
       Font labelFont = new Font("宋體", Font.CENTER_BASELINE, 12);
       Font kfont = new Font("宋體", Font.CENTER_BASELINE, 13);// 底部圖例
      
       chart.getLegend().setItemFont(kfont);
       chart.setBackgroundPaint(Color.WHITE);

       CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
       // x軸 // 分類軸網格是否可見
       categoryplot.setDomainGridlinesVisible(true);
       // y軸 //數據軸網格是否可見
       categoryplot.setRangeGridlinesVisible(true);
       // 虛線色彩
       categoryplot.setRangeGridlinePaint(Color.WHITE);
       // 虛線色彩
       categoryplot.setDomainGridlinePaint(Color.WHITE);
       // 圖片背景顏色
       categoryplot.setBackgroundPaint(Color.lightGray);
       // 設置軸和麪板之間的距離
//       categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
       //沒有數據時顯示的文字說明。
       categoryplot.setNoDataMessage("沒有數據!");
       categoryplot.setNoDataMessagePaint(Color.RED);
      
       // X軸
       CategoryAxis domainAxis = categoryplot.getDomainAxis();
       domainAxis.setLabelFont(labelFont);// x軸標題字體設置
       domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // x橫軸上45度傾斜
       //設置最低的一個   Item   與圖片底端的距離
       domainAxis.setLowerMargin(0.0);
       //設置最高的一個   Item   與圖片頂端的距離
       domainAxis.setUpperMargin(0.0);

       // Y軸
       ValueAxis rangeAxisv = categoryplot.getRangeAxis();
       rangeAxisv.setLabelFont(labelFont);// y軸字體設置
       rangeAxisv.setTickLabelFont(labelFont);// y軸字體設置
      
      
       // 數
       NumberAxis rangeAxis = (NumberAxis) categoryplot.getRangeAxis();
       // 格式化
       DecimalFormat decimalFormat = new DecimalFormat("0.0");
       rangeAxis.setNumberFormatOverride(decimalFormat);
    //設置Y軸的最小值
    rangeAxis.setLowerBound(0);
    //設置Y軸間隔單位
    rangeAxis.setTickUnit(new NumberTickUnit(5D));
    //設置Y軸的最大值
    rangeAxis.setUpperBound(maxrange+3D);

      
       // 獲得renderer 注意這裏是下嗍造型到lineandshaperenderer!!
       LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();

       lineandshaperenderer.setBaseShapesVisible(true); // series 點(即數據點)可見

       lineandshaperenderer.setBaseLinesVisible(true); // series 點(即數據點)間有連線可見

       // 顯示折點數據
       if (showCornerValue) {
        lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
           lineandshaperenderer.setBaseItemLabelsVisible(true);
       }
      
       return chart;
   }
}


 

2. 請求服務器中的action
/**
  * 率(百分比)
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return
  * @throws Exception
  * @author qiyh
  */
 public ActionForward showRate(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {

  // 初始化跳轉頁面
  String forwordName = "showFaultAmountRate";

  StatBIListForm theForm = (StatBIListForm) form;
  FaultRateVO faultRateVo = theForm.getFaultRateVo();
  
  // 當前時間
  Calendar cl = Calendar.getInstance();
  cl.setTime(new Date());
  if (null == faultRateVo.getBeginYear()) {
   faultRateVo.setBeginYear(String.valueOf(cl.get(Calendar.YEAR)-1));
  }
  if (null == faultRateVo.getBeginMonth()) {
   faultRateVo.setBeginMonth(String.valueOf(cl.get(Calendar.MONTH)+1));
  }
  if (null == faultRateVo.getEndYear()) {
   faultRateVo.setEndYear(String.valueOf(cl.get(Calendar.YEAR)));
  }
  if (null == faultRateVo.getEndMonth()) {
   faultRateVo.setEndMonth(String.valueOf(cl.get(Calendar.MONTH)));
  }
  
  Date beginDate = parseStrToDate(faultRateVo.getBeginYear(), faultRateVo.getBeginMonth());
  Date endDate = parseStrToDate(faultRateVo.getEndYear(), faultRateVo.getEndMonth());
  // 參數
  Map paraMap = new HashMap();
  paraMap.put("beginDate",beginDate);
  paraMap.put("endDate",endDate);

  // 統計維度
  String dimensionality = faultRateVo.getDimensionality();
  StatBIListService statBIListService = (StatBIListService) this.getBeanFactory("statBIListService");
  List getRate_list = null;
  
   if ("models".equals(dimensionality)) {
   List searchContentList = new ArrayList();
   String searchContents = faultRateVo.getSearchContent();
   if (null != searchContents) {
    searchContents = searchContents.trim().replaceAll(",", ",");
    if (0 < searchContents.indexOf(",")) {
     String[] arry = searchContents.split(",");
     for (int i = 0; i < arry.length; i++) {
      searchContentList.add(arry[i]);
     }
    }else {
     searchContentList.add(searchContents);
    }
   }
   paraMap.put("searchContentArry", searchContentList);

   // 從業務邏輯層查詢數據列表
   getRate_list = statBIListService.queryForList("StatBIList.showFaultAmountRateByModels", paraMap);
  }
  
 // 生成圖表 
        String rateUrl = getRateUrl("故障損失率分析", getRate_list, false, request);
       
        request.setAttribute("rateUrl", rateUrl);
        theForm.setDataList(getRate_list);
  // 跳轉到相應的頁面
  return mapping.findForward(forwordName);
 }
 
 /**
  * 生成圖表
  * @param title
  *   標題
  * @param dataList
  *   數據
  * @param showValue
  *   是否在拐點顯示值
  * @param request
  *   request
  * @return
  */
 private String getRateUrl(String title, List dataList, boolean showValue, HttpServletRequest request){
  String filename = null;
  // 定義y軸最大值
  double maxrange = 0D;
  // 數據集
  DefaultCategoryDataset line_dataset = new DefaultCategoryDataset();
  if (null != dataList) {
         for (Iterator iterator = dataList.iterator(); iterator.hasNext();) {
          FaultRateVO faultAmountRateVo = (FaultRateVO) iterator.next();
          if (null != faultAmountRateVo && null != faultAmountRateVo.getYearm()) {
           // 統計實體
              String statEntity = faultAmountRateVo.getStatEntity() != null ? faultAmountRateVo.getStatEntity() : "";
              // 率
              double rate = Double.parseDouble(faultAmountRateVo.getRate() != null ? faultAmountRateVo.getRate() : "0.00");
              // 年月
              String yearm = faultAmountRateVo.getYearm() != null ? faultAmountRateVo.getYearm() : "0";
              
              maxrange = maxrange > rate ? maxrange : rate;
              
              // 將數據添加至列表 
              line_dataset.addValue(rate, statEntity, yearm);
    }
         }
  }

        // 調用工具類生成折線圖
        JFreeChart chart = JFreeChartUtils.createLineXYChart(title, null, "佔有率%", line_dataset, maxrange, showValue);
        try {
            filename = ServletUtilities.saveChartAsPNG(chart, 600, 400, null, request.getSession());
        } catch (IOException e) {
            e.printStackTrace();
        }
        String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;

        return graphURL;
 }

發佈了27 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章