您的位置:首页 > 其它

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

2017-09-07 18:15 686 查看
利用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));
standardChartThem
4000
e.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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: