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

来源:互联网 发布:图片叠加软件 编辑:程序博客网 时间:2024/05/22 10:39

利用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,第四个参数表示是否显示提示,第五个参数表示图中是否存在URLJFreeChart 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();@Overrideprotected 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); // 创建一个JFreeChartchart.getLegend().setFrame(new BlockBorder(Color.WHITE));chart.setTitle(new TextTitle("材料数据图", new Font("宋体", Font.BOLD , 15)));// 可以重新设置标题,替换“hi”标题CategoryPlot plot = (CategoryPlot) chart.getPlot();// 获得图标中间部分,即plotCategoryAxis 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 blocke.printStackTrace();}}@Overridepublic 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;}}


原创粉丝点击