1. 程式人生 > >利用JFrameChart生成報表

利用JFrameChart生成報表

 案例一:利用application生成(解決中文亂碼問題)

原始碼如下:

 
package test;

import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class Test
{
	public static void main(String[] args) throws IOException{
		CategoryDataset dataset = getDataSet();
		JFreeChart chart = ChartFactory.createBarChart3D(
							"水果產量圖", // 圖表標題
							"水果", // 目錄軸的顯示標籤
							"產量", // 數值軸的顯示標籤
							dataset, // 資料集
							PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
							true, 	// 是否顯示圖例(對於簡單的柱狀圖必須是false)
							false, 	// 是否生成工具
							false 	// 是否生成URL連結
							);
			FileOutputStream fos_jpg = null;
		try {
			fos_jpg = new FileOutputStream("D:\\fruit.jpg");
			ChartUtilities.writeChartAsJPEG(fos_jpg,1,chart,400,300,null);
		} finally {
			try {
				fos_jpg.close();
			} catch (Exception e) {}
		}
	}
	/**
	 * 獲取一個演示用的簡單資料集物件
	 * @return
	 */
	private static CategoryDataset getDataSet() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100, "成都", "蘋果");
		dataset.addValue(200, "成都", "梨子");
		dataset.addValue(300, "成都", "葡萄");
		dataset.addValue(400, "成都", "香蕉");
		dataset.addValue(500, "西昌", "蘋果");
		dataset.addValue(200, "西昌", "梨子");
		dataset.addValue(300, "西昌", "葡萄");
		dataset.addValue(400, "西昌", "香蕉");
		return dataset;
	}
	/**
	 * 獲取一個演示用的組合資料集物件
	 * @return
	 */
	private static CategoryDataset getDataSet2() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100, "北京", "蘋果");
		dataset.addValue(100, "上海", "蘋果");
		dataset.addValue(100, "廣州", "蘋果");
		dataset.addValue(200, "北京", "梨子");
		dataset.addValue(200, "上海", "梨子");
		dataset.addValue(200, "廣州", "梨子");
		dataset.addValue(300, "北京", "葡萄");
		dataset.addValue(300, "上海", "葡萄");
		dataset.addValue(300, "廣州", "葡萄");
		dataset.addValue(400, "北京", "香蕉");
		dataset.addValue(400, "上海", "香蕉");
		dataset.addValue(400, "廣州", "香蕉");
		dataset.addValue(500, "北京", "荔枝");
		dataset.addValue(500, "上海", "荔枝");
		dataset.addValue(500, "廣州", "荔枝");
		return dataset;
	}
}



增加如下的程式碼,解決漢字亂碼問題:

CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
		NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();  
		CategoryAxis domainAxis = categoryplot.getDomainAxis();  
		TextTitle textTitle = chart.getTitle();
		 

		textTitle.setFont(new Font("黑體", Font.PLAIN, 20));   
		   
		domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));  
		   
		domainAxis.setLabelFont(new Font("宋體", Font.PLAIN, 12));  
		  
		numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));  
		 
		numberaxis.setLabelFont(new Font("黑體", Font.PLAIN, 12));  
		    
		chart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12));




標題亂碼

   chart.getTitle().setFont(new Font("宋體", Font.BOLD,12));



其他

   1. CategoryAxis domainAxis = plot.getDomainAxis();  
   2.
   3. // NumberAxis  valueAxis=(NumberAxis) plot.getRangeAxis(); 
   4. //有人說這個是水平方向設定的 方法。
   5. ValueAxis numberaxis = plot.getRangeAxis();
   6.   
   7. /*------設定X軸座標上的文字-----------*/  
   8. domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));   
   9.   
  10. /*------設定X軸的標題文字------------*/  
  11. domainAxis.setLabelFont(new Font("宋體", Font.PLAIN, 12));   
  12.   
  13. /*------設定Y軸座標上的文字-----------*/  
  14. numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));   
  15.   
  16. /*------設定Y軸的標題文字------------*/  
  17. numberaxis.setLabelFont(new Font("黑體", Font.PLAIN, 12));   
  18.   
  19. /*------這句程式碼解決了底部漢字亂碼的問題-----------*/  
  20. jfreechart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12));  

前言
     關於Struts2入門以及提高等在這裡就不介紹了,但是關於Struts2的學習有以下推薦:

    1. struts2-showcase-2.0.6.war:這個是官方自帶的Demo(struts-2.0.6-all.zip\struts-2.0.6\apps目錄下),非常全面,直接部署就可以了(很多朋友Struts2能學很好我估計還是直接從這裡學來的)。
    2. wiki-WebWork:入了門的朋友應該都知道,strust2由webwork2和struts1.x合併起來的,但主要還是以webwork2為主,所以如果找不到Struts2的資料可以找WebWork資料看看。
    3. Max On Java的部落格,他的部落格的資料在中文的Struts2算是比較全的了,寫得很詳細。

     關於JFreeChart入門等這裡我也不打算介紹了,中文資料很多了。

正題
     下面以邊帖圖片和程式碼的方式來講解Struts2JFreeChart的整合。
     搭建環境:首先帖一張工程的目錄結構以及所需的jar包。注意:如果你不打算自己寫ChartResult的話只需要引入struts2-jfreechart-plugin-2.0.6.jar(這個在struts-2.0.6-all.zip可以找到了):
         
       1.依次帖web.xml、struts.xml、struts.properties和struts-jfreechart.xml幾個配置檔案的程式碼:
        web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" 
    xmlns
="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
><filter><filter-name>struts2</filter-name><filter-class>
            org.apache.struts2.dispatcher.FilterDispatcher
        
</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>

        struts.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"
><struts><include file="struts-jfreechart.xml"/></struts>

        struts.properties

struts.ui.theme=simple

        struts-jfreechart.xml 

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
><struts><package name="jFreeChartDemonstration" extends="struts-default"
        namespace
="/jfreechart"><result-types><result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"></result-type></result-types><action name="JFreeChartAction" class="com.tangjun.struts2.JFreeChartAction"><result type="chart"><param name="width">400</param><param name="height">300</param></result></action></package></struts>

        說明:這裡只需要說明下struts-jfreechart.xml,這裡直接呼叫已經寫好的類ChartResult,這個類是繼承自com.opensymphony.xwork2.Result,傳入生成圖片大小的引數width和height就可以了。

       2. 新建JFreeChartAction繼承ActionSupport,生成JFreeChart物件並儲存到chart中,注意這個名稱是固定的。

package com.tangjun.struts2;

import com.opensymphony.xwork2.ActionSupport;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

publicclass JFreeChartAction extends ActionSupport {

    
/**
     * 
     
*/privatestaticfinallong serialVersionUID =5752180822913527064L;

    
//供ChartResult呼叫->ActionInvocation.getStack().findValue("chart")private JFreeChart chart;
    
    @Override
    
public String execute() throws Exception {
        
//設定資料        DefaultPieDataset data =new DefaultPieDataset();
        data.setValue(
"Java"new Double(43.2));
        data.setValue(
"Visual Basic"new Double(1.0));
        data.setValue(
"C/C++"new Double(17.5));
        data.setValue(
"tangjun"new Double(60.0));
        
//生成JFreeChart物件        chart = ChartFactory.createPieChart("Pie Chart", data, true,truefalse);
        
        
return SUCCESS;
    }
public JFreeChart getChart() {
        
return chart;
    }

    
publicvoid setChart(JFreeChart chart) {
        
this.chart = chart;
    }
}


OK!至此程式碼已經全部貼完。
輸入訪問 http://localhost:8080/Struts2JFreeChart/jfreechart/JFreeChartAction.action
顯示結果如下:


補充
    以上生成的圖片是PNG格式的圖片,如果需要自定義圖片格式的話(好像只能支援JPG和PNG格式),那麼自己寫一個ChartResult繼承自StrutsResultSupport,見程式碼:

package com.tangjun.struts2.chartresult;

import java.io.OutputStream;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;

import com.opensymphony.xwork2.ActionInvocation;

publicclass ChartResult extends StrutsResultSupport {

    
/**
     * 
     
*/privatestaticfinallong serialVersionUID =4199494785336139337L;
    
    
//圖片寬度privateint width;
    
//圖片高度privateint height;
    
//圖片型別 jpg,pngprivate String imageType;
    
    
    @Override
    
protectedvoid doExecute(String arg0, ActionInvocation invocation) throws Exception {
        JFreeChart chart 
=(JFreeChart) invocation.getStack().findValue("chart");
        HttpServletResponse response 
= ServletActionContext.getResponse();
        OutputStream os 
= response.getOutputStream();
        
        
if("jpeg".equalsIgnoreCase(imageType) ||"jpg".equalsIgnoreCase(imageType))
            ChartUtilities.writeChartAsJPEG(os, chart, width, height);
        
elseif("png".equalsIgnoreCase(imageType))
            ChartUtilities.writeChartAsPNG(os, chart, width, height);
        
else
            ChartUtilities.writeChartAsJPEG(os, chart, width, height);
        
        os.flush();

    }
    
publicvoid setHeight(int height) {
        
this.height = height;
    }

    
publicvoid setWidth(int width) {
        
this.width = width;
    }
    
    
publicvoid setImageType(String imageType) {
        
this.imageType = imageType;
    }

}

如此的話還需要小小的修改一下struts-jfreechart.xml:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
><struts><package name="jFreeChartDemonstration" extends="struts-default"
        namespace
="/jfreechart"><!-- 自定義返回型別 --><result-types><!-- 
            <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"></result-type>
             
--><result-type name="chart" class="com.tangjun.struts2.chartresult.ChartResult"></result-type></result-types><action name="JFreeChartAction" class="com.tangjun.struts2.JFreeChartAction"><!--
              <result type="chart"> 
                   <param name="width">400</param>
                   <param name="height">300</param>
            </result>
            
--><result type="chart"><param name="width">400</param><param name="height">300</param><param name="imageType">jpg</param></result></action></package></struts>

OK!顯示的效果是一樣的,只是圖片格式不一樣,當然這裡面你可以做更多操作!

相關推薦

利用JFrameChart生成報表

 案例一:利用application生成(解決中文亂碼問題) 原始碼如下: package test; import java.awt.Font; import java.io.FileOutputStream; import java.io.IOException

C# 利用ReportViewer生成報表

ces 聯系 rtp 構造 code winform images 參數 class 本文主要是利用微軟自帶的控件ReportViewer進行報表設計的小例子 涉及知識點: ReportViewer :位於Microsoft.Reporting.WinForms命名空間,

【FreeMarker】利用freemarker生成word版報表

前言: 在很多業務系統中,都需要生成月報,週報的報表。freemarker就很適合生成word版報表,freemarker就是利用word本身自帶的xml格式進行文字替換,圖片替換等操作的,當然除了簡單的替換文字之外,他還有其他的高階用法,詳情請見fre

利用RTFtemplate生成rtf報表

RTFTemplate巧妙的利用了word的“域”和書籤實現了報表模板的設計。通過向rtf插入特定型別的域欄位,用來標記將會被報表引擎用實際資料或者邏輯替代的部分。 通常單一的值用:Mergefield代替。 迴圈和條件採用:bookmark替代。 RefTemplate底

利用反射生成SQL語句

mman com inf get bool 通過 公開 public .get // 修改學員信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映獲取類對所有屬性,用來動態生成SQL語句

利用dw取報表格式代碼,沒有格式信息

格式 是否 blog 編輯 大小 解決方法 目前 excel表 excel 1、向dw中復制表樣板時,註意在dw中設置,編輯,首選項,選擇復制黏貼的樣式,不然出現的代碼是不加表格的2、對於表格的大小是否跟隨內容變動,暫時還未解決問題分析:應該屬於excel表格的設置問題,先

利用letsencrypte生成證書時,create virtual environment失敗

letsencrypt oserror ./letsencrypt-auto certonly --standalone利用letsencrypt生成證書時 ,出現下面錯誤提示0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.

利用python生成交換機的VRF配置文件

cnblogs pan 運行 成交 交換機 sting write quit spa 為了快速生成有規律的VRF,寫了一個python腳本,可以快速生成如下的VRF配置。 ip vpn-instance vpn0ipv4-family route-distinguish

利用Javascript生成txt文本文件

nec clas utf-8 blog immediate exp alt eve ongui <script type="text/javascript"> // 將字符串用txt的格式報存 ie中會出現中文亂碼的問題 var saveAs = sa

【本地服務器】利用openssl生成證書

.html num href 創建證書 inf blog article nop cmd (一)下載openssl軟件,解壓,進入bin目錄 下載地址 (二)1.在當前bin目錄,按住shift鍵右擊,選擇"在此處打開命令窗口" 2.打開

利用meterpreter生成一個簡單的android木馬

是我 linux 學習過程 手機 命令 簡單的 lin 軟件 bubuko 這個學習過程我是在kali linux下進行的,成功的感染了自己的手機,當然了apk包沒改簽名也沒有加小圖標,所以只能當是一個實驗吧。 首先使用這個命令: 使用這個命令,可以生成一個apk包,但是

C# 利用SharpZipLib生成壓縮包

helper 管理 .com rep text har bzip2 reading int 本文通過一個簡單的小例子簡述SharpZipLib壓縮文件的常規用法,僅供學習分享使用,如有不足之處,還請指正。 什麽是SharpZipLib ? SharpZipLib是一個C#的

使用Python定時執行一任務,自動登錄某web系統,生成報表,然後發送郵件給指定人員

sel web mail word 發送郵件 查詢條件 xxxxx receive emp 一、項目需求 每周從A系統生成一張Excel報表,發送此報表給指定人員,相關人員依據此報表去完成後續的工作。 項目限制: 1、無法通過E

Java實驗--課上提到的隨機數生成原理簡單實現(不利用生成隨機數的簡單算法)

9.png 技術分享 當前 span col 分享 args 簡單 返回 對於隨機數的實驗,根據課程上的教程,有如下的公式: 對應的變量參數的說明: 其中對應的Mouduls變量對應的就是公式中a的值,在公式中的含義就是相當於要循環多少個數才重復的一個值。 Mult

【VBA】【一天的心血,收藏一下】一鍵生成報表2

Public batch$ Sub crAddReport() '獲取窗體單選框選擇 UserForm1.Show If UserForm1.OptionButton1.Value = True Then batch = "一" ElseIf Us

【VBA】【一天的心血,收藏一下】一鍵生成報表

Sub crDelReport() t1 = Timer Application.ScreenUpdating = False Call importLog Call findBrokenStation Call nowCrRe

如何利用OpenSSL生成證書

此文已由作者趙斌授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 一、前言 最近為了測試內容分發網路(Content Delivery Network,簡稱 CDN)新增的新功能,支援HYTTPS安全加速功能,需要對證書的有效性進行驗證,於是乎需要自己生成合法的、非法的、過期的證書。

使用python獲取整月每一天的系統監控資料生成報表

1.安裝阿里開源監控工具tsar tsar官方網站  wget -O tsar.zip https://github.com/alibaba/tsar/archive/master.zip --no-check-certificate unzip tsar.zip cd tsar m

java 利用ID生成六位唯一驗證碼

package com.hqjl.componentconfig.util; import java.util.Random; /** * @author chunying */ public class ShareCodeUtil { /** * 邀請碼生成器,演算法原理: * 1)

利用itertools生成密碼字典,多執行緒撞庫破解rar壓縮檔案密碼

指令碼功能:  利用itertools生成密碼字典(迭代器形式)  多執行緒併發從密碼字典中取出密碼進行驗證  驗證成功後把密碼寫入檔案中儲存 #!/usr/bin/env python # -*- coding: UTF-8 -*- # Author:Leslie-x import itert