Java报表之JFreeChart

1.创建垂直柱状表示例
首先导入相应的包
在这里插入图片描述
复制该文件夹下的包到项目lib下

在这里插入图片描述
web.xml中加入:

  <servlet>
		<servlet-name>DisplayChart</servlet-name>
		<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DisplayChart</servlet-name>
		<url-pattern>/DisplayChart</url-pattern>
	</servlet-mapping>

BarChart1类:

public static String getBarChart(HttpSession session)throws Exception{
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(510,"深圳" , "苹果");
		dataset.addValue(320,"深圳" , "香蕉");
		dataset.addValue(580,"深圳" , "橘子");
		dataset.addValue(390,"深圳" , "梨子");
		JFreeChart chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售", dataset, 
				PlotOrientation.VERTICAL, true, true, true);
		String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500, null,session);
		return fileName;
	}

jsp代码:

<%
	String fileName = BarChart1.getBarChart(session);
	System.out.println(fileName);
%>
<img src="DisplayChart?filename=<%=fileName %>" width="700" height="500" border="0">

访问:
在这里插入图片描述
得到:
在这里插入图片描述
1.1 利用 JFreeChart 创建按颜色分类的水果销售报表

<%
	String fileName = BarChart3.getBarChart(session);
	System.out.println(fileName);
%>
<img src="DisplayChart?filename=<%=fileName %>" width="700" height="500" border="0">
	public static String getBarChart(HttpSession session)throws Exception{
		double [][]data=new double[][] {{1320},{720},{830},{400}};
		String []rowKeys= {"苹果","香蕉","橘子","梨子"};
		String []columnKeys= {"深圳"};
		CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
		JFreeChart chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售", dataset, 
				PlotOrientation.VERTICAL, true, true, true);
		String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500, null,session);
		return fileName;
	}

在这里插入图片描述
1.2利用 JFreeChart 创建按颜色分类并且按地区分类水果销售报表

public static String getBarChart(HttpSession session)throws Exception{
		//里面的一个括号内的代表的是不同地区的同种水果
		double [][]data=new double[][] {{1320,956,241,567},{720,128,576,483},{830,257,496,578},{400,129,1110,1230}};
		String []rowKeys= {"苹果","香蕉","橘子","梨子"};
		String []columnKeys= {"深圳","北京","上海","南京"};
		CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
		JFreeChart chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售", dataset, 
				PlotOrientation.VERTICAL, true, true, true);
		String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500, null,session);
		return fileName;
	}

在这里插入图片描述
1.3用 JFreeChart 创建自定义 3D 柱状报表

	public static String getBarChart(HttpSession session)throws Exception{
		//里面的一个括号内的代表的是不同地区的同种水果
		double [][]data=new double[][] {{1320,956,241,567},{720,128,576,483},{830,257,496,578},{400,129,1110,1230}};
		String []rowKeys= {"苹果","香蕉","橘子","梨子"};
		String []columnKeys= {"深圳","北京","上海","南京"};
		CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
		JFreeChart chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售", dataset, 
				PlotOrientation.VERTICAL, true, true, true);
		
		CategoryPlot plot = chart.getCategoryPlot();
		// 设置网格背景颜色
		plot.setBackgroundPaint(Color.white);
		// 设置网格竖线颜色
		plot.setDomainGridlinePaint(Color.pink);
		// 设置网格横线颜色
		plot.setRangeGridlinePaint(Color.pink);
		
		// 显示每个柱的数值,并修改该数值的字体属性
		BarRenderer3D renderer=new BarRenderer3D();
		renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer.setBaseItemLabelsVisible(true);
		
		renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
		renderer.setItemLabelAnchorOffset(10D);  
		
		// 设置平行柱的之间距离
		renderer.setItemMargin(0.4);
		
		plot.setRenderer(renderer);
		
		String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500, null,session);
		return fileName;
	}

在这里插入图片描述

sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
2.利用 JFreeChart 创建普通饼状图报表

public static String getPieChart(HttpSession session)throws Exception{
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("种类1", 1000);
		dataset.setValue("种类2", 800);
		dataset.setValue("种类3", 400);
		dataset.setValue("种类4", 100);
		dataset.setValue("种类5", 29);
		
		JFreeChart chart = ChartFactory.createPieChart("分布图", dataset, true, true, true);
			
		String filename = ServletUtilities.saveChartAsPNG(chart, 700, 500, session);
		return filename;
	}

在这里插入图片描述
2.1利用 JFreeChart 创建普通饼状图报表,并且突出一个

	public static String getPieChart(HttpSession session)throws Exception{
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("种类1", 1000);
		dataset.setValue("种类2", 800);
		dataset.setValue("种类3", 400);
		dataset.setValue("种类4", 100);
		dataset.setValue("种类5", 29);
		
		JFreeChart chart = ChartFactory.createPieChart("分布图", dataset, true, true, true);
		
		// 副标题
		chart.addSubtitle(new TextTitle("2019年度"));
		
		PiePlot pieplot=(PiePlot)chart.getPlot();
		pieplot.setLabelFont(new Font("宋体",0,11));
		// 设置饼图是圆的(true),还是椭圆的(false);默认为true  
		pieplot.setCircular(true);
		// 没有数据的时候显示的内容
		pieplot.setNoDataMessage("无数据显示");
		StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator("{0}:({1}.{2})", NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance());  
		pieplot.setLabelGenerator(standarPieIG);  
		
		String filename = ServletUtilities.saveChartAsPNG(chart, 700, 500, session);
		return filename;
	}

在这里插入图片描述
2.2 突出显示
加上:

pieplot.setExplodePercent("种类1",0.23); 

在这里插入图片描述
2.3利用 JFreeChart 创建 3D 饼状图报表

public static String getPieChart(HttpSession session)throws Exception{
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("种类1", 1000);
		dataset.setValue("种类2", 800);
		dataset.setValue("种类3", 400);
		dataset.setValue("种类4", 100);
		dataset.setValue("种类5", 29);
		//主要在这里方法换成3D
		JFreeChart chart = ChartFactory.createPieChart3D("分布图", dataset, true, true, true);
		
		// 副标题
		chart.addSubtitle(new TextTitle("2019年度"));
		
		PiePlot pieplot=(PiePlot)chart.getPlot();
		pieplot.setLabelFont(new Font("宋体",0,11));
		// 设置饼图是圆的(true),还是椭圆的(false);默认为true  
		pieplot.setCircular(true);
		// 没有数据的时候显示的内容
		pieplot.setNoDataMessage("无数据显示");
		StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator("{0}:({1}.{2})", NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance());  
		pieplot.setLabelGenerator(standarPieIG); 
		
		String filename = ServletUtilities.saveChartAsPNG(chart, 700, 500, session);
		return filename;
	}

在这里插入图片描述
2.3.1创建 3D 饼状图报表,设置样式

		PiePlot3D pieplot3d = (PiePlot3D)chart.getPlot(); 
		
		//设置开始角度  
		pieplot3d.setStartAngle(120D);  
		//设置方向为”顺时针方向“  
		pieplot3d.setDirection(Rotation.CLOCKWISE);  
		//设置透明度,0.5F为半透明,1为不透明,0为全透明  
		pieplot3d.setForegroundAlpha(0.7F);

在这里插入图片描述
3. ,利用 JFreeChart 创建折线图报表

public static String genLineChart(HttpSession session)throws Exception{
		
		//访问量统计
		TimeSeries timeSeries = new TimeSeries("某网站访问量统计",Month.class);
		//添加数据
		timeSeries.add(new Month(1, 2019), 100);
		timeSeries.add(new Month(2, 2019), 200);
		timeSeries.add(new Month(3, 2019), 300);
		timeSeries.add(new Month(4, 2019), 400);
		timeSeries.add(new Month(5, 2019), 500);
		timeSeries.add(new Month(6, 2019), 450);
		timeSeries.add(new Month(7, 2019), 700);
		timeSeries.add(new Month(8, 2019), 800);
		timeSeries.add(new Month(9, 2019), 120);
		timeSeries.add(new Month(10, 2019), 1000);
		timeSeries.add(new Month(11, 2019), 900);
		timeSeries.add(new Month(12, 2019), 1100);
		
		//定义时间序列的集合
		TimeSeriesCollection lineDataset = new TimeSeriesCollection();
		lineDataset.addSeries(timeSeries);
		
		JFreeChart chart = ChartFactory.createTimeSeriesChart("访问量统计时间折线图", "月份", "访问量", lineDataset, true, true, true);
		String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500, session);
		
		return fileName;
	}

在这里插入图片描述
设置时间轴范围
加上:

//设置时间轴的范围。
		XYPlot plot = (XYPlot) chart.getPlot(); 
		DateAxis dateaxis = (DateAxis)plot.getDomainAxis();
		dateaxis.setDateFormatOverride(new java.text.SimpleDateFormat("M月"));
		dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH,1)); 

在这里插入图片描述
设置曲线是否显示数据点

//设置曲线是否显示数据点
		XYLineAndShapeRenderer xylinerenderer = (XYLineAndShapeRenderer)plot.getRenderer();
		xylinerenderer.setBaseShapesVisible(true); 

在这里插入图片描述
/设置曲线显示各数据点的值

//设置曲线显示各数据点的值
		XYItemRenderer xyitem = plot.getRenderer(); 
		xyitem.setBaseItemLabelsVisible(true);
		xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER)); 
		xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
		xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 12)); 
		plot.setRenderer(xyitem);

在这里插入图片描述
对比折线

public static String genLineChart(HttpSession session)throws Exception{
		
		//访问量统计
		TimeSeries timeSeries = new TimeSeries("A网站访问量统计",Month.class);
		//添加数据
		timeSeries.add(new Month(1, 2019), 100);
		timeSeries.add(new Month(2, 2019), 200);
		timeSeries.add(new Month(3, 2019), 300);
		timeSeries.add(new Month(4, 2019), 400);
		timeSeries.add(new Month(5, 2019), 500);
		timeSeries.add(new Month(6, 2019), 450);
		timeSeries.add(new Month(7, 2019), 700);
		timeSeries.add(new Month(8, 2019), 800);
		timeSeries.add(new Month(9, 2019), 120);
		timeSeries.add(new Month(10, 2019), 1000);
		timeSeries.add(new Month(11, 2019), 900);
		timeSeries.add(new Month(12, 2019), 1100);
		
		//访问量统计
		TimeSeries timeSeries1 = new TimeSeries("B网站访问量统计",Month.class);
		//添加数据
		timeSeries1.add(new Month(1, 2019), 130);
		timeSeries1.add(new Month(2, 2019), 150);
		timeSeries1.add(new Month(3, 2019), 40);
		timeSeries1.add(new Month(4, 2019), 350);
		timeSeries1.add(new Month(5, 2019), 500);
		timeSeries1.add(new Month(6, 2019), 450);
		timeSeries1.add(new Month(7, 2019), 600);
		timeSeries1.add(new Month(8, 2019), 800);
		timeSeries1.add(new Month(9, 2019), 120);
		timeSeries1.add(new Month(10, 2019), 900);
		timeSeries1.add(new Month(11, 2019), 1000);
		timeSeries1.add(new Month(12, 2019), 750);
		
		//定义时间序列的集合
		TimeSeriesCollection lineDataset = new TimeSeriesCollection();
		lineDataset.addSeries(timeSeries);
		lineDataset.addSeries(timeSeries1);
		
		JFreeChart chart = ChartFactory.createTimeSeriesChart("访问量统计时间折线图", "月份", "访问量", lineDataset, true, true, true);
		
		
		//设置时间轴的范围。
		XYPlot plot = (XYPlot) chart.getPlot(); 
		DateAxis dateaxis = (DateAxis)plot.getDomainAxis();
		dateaxis.setDateFormatOverride(new java.text.SimpleDateFormat("M月"));
		dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH,1)); 
		
		//设置曲线是否显示数据点
		XYLineAndShapeRenderer xylinerenderer = (XYLineAndShapeRenderer)plot.getRenderer();
		xylinerenderer.setBaseShapesVisible(true); 
		
		//设置曲线显示各数据点的值
		XYItemRenderer xyitem = plot.getRenderer(); 
		xyitem.setBaseItemLabelsVisible(true);
		xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER)); 
		xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
		xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 12)); 
		plot.setRenderer(xyitem);
		
		String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500, session);
		
		return fileName;
	}

在这里插入图片描述
JFreeChart和Struts2的整合
官方API:https://struts.apache.org/plugins/jfreechart/

web.xml配置:

<filter>
       <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  
  <filter-mapping>
	      <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
	      <url-pattern>/*</url-pattern>
  </filter-mapping>

struts.xml

<package name="jfeechart" extends="jfreechart-default">
		<action name="barChart" class="com.java1234.struts2JFreeChart.BarCharAction">
			<result name="success" type="chart">
				<param name="value">chart</param>
				<param name="type">png</param>
			    <param name="width">700</param>
			    <param name="height">500</param> 
	  		</result>
		</action>		
	</package>

action

public class BarCharAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private JFreeChart chart;
	
	public JFreeChart getChart() {
		return chart;
	}

	@Override
	public String execute() throws Exception {
		double [][]data=new double[][]{{1320,1110,1123,321},{720,210,1423,1321},{830,1310,123,521},{400,1110,623,321}};
		String []rowKeys={"苹果","香蕉","橘子","梨子"};
		String []columnKeys={"深圳","北京","上海","南京"};
		CategoryDataset dataset=DatasetUtilities.createCategoryDataset(rowKeys,columnKeys ,data);
		chart=ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售", dataset,
				PlotOrientation.VERTICAL, true, true, true);
		
		CategoryPlot plot=chart.getCategoryPlot();
		// 设置网格背景颜色
		plot.setBackgroundPaint(Color.white);
		// 设置网格竖线颜色
		plot.setDomainGridlinePaint(Color.pink);
		// 设置网格横线颜色
		plot.setRangeGridlinePaint(Color.pink);
		
		// 显示每个柱的数值,并修改该数值的字体属性
		BarRenderer3D renderer=new BarRenderer3D();
		renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer.setBaseItemLabelsVisible(true);
		
		renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
		renderer.setItemLabelAnchorOffset(10D);  
		
		// 设置平行柱的之间距离
		renderer.setItemMargin(0.4);
		
		plot.setRenderer(renderer);
		
		return SUCCESS;
	}	
}

图片请求:

<img src="barChart"/>

请求:
在这里插入图片描述
结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34721292/article/details/91445397