【知了堂学习笔记】JfreeChart制作一些简单的报表

利用JfreeChart 制作报表,JfreeChart是是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,JfreeChart可以生成饼图(pie charts)、柱状图(bar charts)、散点图(scatterplots)、时序图(time series)、甘特图(Gantt charts)等,

 

在制作报表之前首先需要导入 jcommon-1.0.23.jar 和 jfreechart.jar 两个jar包。

 

一、饼图

 

制作一个简单的饼图只需要几个步骤:

1.    创建数据源   DefaultPieDataset

2.    创建绘制图像的类JfreeChart

3.    设置一下图像的简单的格式

这是一个简单的饼图


下面是一个3D的饼图,只需要创建饼图的时候为3D就行了

JFreeChart chart = ChartFactory.createPieChart3D("材料数据图", dpt, true, true, false)

package jfree;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.text.NumberFormat;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.util.Rotation;

import com.mysql.jdbc.PreparedStatement;

import jfree.dao.jfreeDao;
import jfree.model.MaterModel;
import jfree.model.jfreeimpl;

/**
 * Servlet implementation class jfreetest
 */
@WebServlet("/jfreetest")
public class jfreetest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private jfreeDao jf = new jfreeimpl();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		List<MaterModel> list = jf.getshow();

		DefaultPieDataset dpt = new DefaultPieDataset();
		
		for (MaterModel ma : list) {
			dpt.setValue(ma.getMaterial_name(), ma.getMaterial_number());
		}
		
		//设置中文乱码
		StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
		standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 20));
		standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 15));
		standardChartTheme.setLargeFont(new Font("宋书", Font.PLAIN, 15));
		ChartFactory.setChartTheme(standardChartTheme);
		//设置背景颜色
		standardChartTheme.setChartBackgroundPaint(new Color(176,224,230));
		standardChartTheme.setPlotBackgroundPaint(new Color(176,224,230));
		standardChartTheme.setPlotOutlinePaint(new Color(176,224,230));
		
		
		// 创建饼状图,第一个参数是标题,第二个参数是一个数据集,第三个参数表示是否显示Legend,第四个参数表示是否显示提示,第五个参数表示图中是否存在URL
		JFreeChart chart = ChartFactory.createPieChart3D("材料数据图", dpt, true, true, false);
		chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
		
		//设置显示百分比
		PiePlot pieplot = (PiePlot) chart.getPlot();
		pieplot.setLabelFont(new Font("宋体", 0, 15));
		StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator("{0}:({1},{2})",
				NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance());
		pieplot.setLabelGenerator(standarPieIG);
		pieplot.setLabelOutlinePaint(null);
		 //设置旋转角度    
	    pieplot.setStartAngle(180.0);    
	    //设置旋转方向,Rotation.CLOCKWISE)为顺时针。    
	    pieplot.setDirection(Rotation.CLOCKWISE);    
	    //设置图表透明图0.0~1.0范围。0.0为完全透明,1.0为完全不透明。    
	    pieplot.setForegroundAlpha(0.7F);
		
		//输出流
		OutputStream os = response.getOutputStream();
		response.setContentType("image/jpeg");
		ChartUtilities.writeChartAsJPEG(os, chart, 650, 500);
	}
}

这是一个3D饼图,并设置一个透明的效果,在材料的名称旁加入了一个百分比数值。



柱状图:


package jfree;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;

import com.mysql.jdbc.PreparedStatement;

import jfree.dao.jfreeDao;
import jfree.model.MaterModel;
import jfree.model.jfreeimpl;

@WebServlet("/jfreetest2")
public class jfreetest2 extends HttpServlet {

	private jfreeDao jf = new jfreeimpl();

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
		List<MaterModel> list = jf.getshow();
		
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		for (MaterModel ma : list) {
			
			dataset.setValue(ma.getMaterial_number(), ma.getMaterial_supplier(),ma.getMaterial_name());
		}
		
		StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
		standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 20));
		standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 15));
		standardChartTheme.setLargeFont(new Font("宋书", Font.PLAIN, 15));
		ChartFactory.setChartTheme(standardChartTheme);
		
		standardChartTheme.setChartBackgroundPaint(new Color(176,224,230));
		standardChartTheme.setPlotBackgroundPaint(new Color(176,224,230));
		standardChartTheme.setPlotOutlinePaint(new Color(176,224,230));
		
		JFreeChart chart = ChartFactory.createBarChart("hi", "材料分类", "材料数量", dataset, PlotOrientation.VERTICAL, true,
				true, false); // 创建一个JFreeChart
		chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
				
		chart.setTitle(new TextTitle("材料数据图", new Font("宋体", Font.BOLD , 15)));// 可以重新设置标题,替换“hi”标题
		CategoryPlot plot = (CategoryPlot) chart.getPlot();// 获得图标中间部分,即plot
		CategoryAxis categoryAxis = plot.getDomainAxis();// 获得横坐标
		categoryAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
		// 设置横坐标字体
		BarRenderer barrenderer = new BarRenderer();
		barrenderer.setMaximumBarWidth(0.5);
		barrenderer.setItemMargin(0.0);
		plot.setRenderer(barrenderer);
		
		OutputStream os = response.getOutputStream();
		response.setContentType("image/jpeg");
		ChartUtilities.writeChartAsJPEG(os, chart, 600, 500);		
	}
}

制作柱状图的步骤和饼图的步骤一样。

因为这是一个通过连接数据库,将表的内容输出成报表,所以报表的内容是用的数据库的,简单报表的内容可以自己设定,不用连接数据库,用setvalue() 来设置内容。

数据库的连接:

package jfree.model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import jfree.dao.jfreeDao;

public class jfreeimpl implements jfreeDao {

	private final static String USER_NAME = "root";
	private final static String PASSWORD = "123456";
	private final static String URL = "jdbc:mysql://localhost:3306/test";
	private final static String Driver = "com.mysql.jdbc.Driver";

	public jfreeimpl() {

		try {
			Class.forName(Driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public List<MaterModel> getshow() {
		String mysql = "select * from materialform";
		Connection conn = null;
		List<MaterModel> list = null;
		try {
			conn =  DriverManager.getConnection(URL, USER_NAME, PASSWORD);
			QueryRunner queryRunner = new QueryRunner();
			list = queryRunner.query(conn, mysql, new BeanListHandler<>(MaterModel.class));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值