历史版本12 :引入JFreeChart图表 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 问题描述编辑

JFreeChart是JAVA平台上很好的一个开放图表绘制类库,不但可以生成多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。所以希望在我们报表工具可以直接引入第三方JFreeChart的图表,使用报表单元格数据,如下图效果:

222

2. 解决方案编辑

FineReport通过自定义函数,创建图表数据源,将生成的JFreeChart图表先转换成图片,然后在报表里面展示。

3. 示例编辑

3.1 创建一个表格数据源(dataset) 
private CategoryDataset[] createDatasets(){里面通过单元格扩展出来的数据定义图表的数据源}
3.2 由ChartFactory 产生 JFreeChart 对象
private JFreeChart createChart(CategoryDataset acategorydataset[]){设置图表的一些属性}
3.3 把jFreeChart图表输出成图片
private BufferedImage createImage(int width, int height) { CategoryDataset acategorydataset[] = createDatasets(); JFreeChart jfreechart = createChart(acategorydataset); return jfreechart.createBufferedImage(width, height); }
3.4 完整代码如下
package com.fr.function; import java.awt.Color; import java.awt.image.BufferedImage; import java.text.NumberFormat; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.DatasetRenderingOrder; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.chart.title.TextTitle; import org.jfree.data.DataUtilities; import org.jfree.data.DefaultKeyedValues; import org.jfree.data.category.CategoryDataset; import org.jfree.data.general.DatasetUtilities; import org.jfree.util.SortOrder; import com.fr.script.AbstractFunction; public class JFreeToChart extends AbstractFunction { private String x, y; public Object run(Object[] args) { this.x = args[0].toString(); this.y = args[1].toString(); BufferedImage image = createImage(600, 400); return image; } private BufferedImage createImage(int width, int height) { CategoryDataset acategorydataset[] = createDatasets(); JFreeChart jfreechart = createChart(acategorydataset); return jfreechart.createBufferedImage(width, height); } private CategoryDataset[] createDatasets() { DefaultKeyedValues defaultkeyedvalues = new DefaultKeyedValues(); String[] xValue = this.x.split(","); String[] yValue = this.y.split(","); for (int i = 0; i < xValue.length; i++) { defaultkeyedvalues.addValue(xValue[i], Double.valueOf(yValue[i])); } defaultkeyedvalues.sortByValues(SortOrder.DESCENDING); org.jfree.data.KeyedValues keyedvalues = DataUtilities .getCumulativePercentages(defaultkeyedvalues); CategoryDataset categorydataset = DatasetUtilities .createCategoryDataset("Languages", defaultkeyedvalues); CategoryDataset categorydataset1 = DatasetUtilities .createCategoryDataset("Cumulative", keyedvalues); return (new CategoryDataset[]{categorydataset, categorydataset1}); } private JFreeChart createChart(CategoryDataset acategorydataset[]) { JFreeChart jfreechart = ChartFactory.createBarChart( "Freshmeat Software Projects", "Language", "Projects", acategorydataset[0], PlotOrientation.VERTICAL, true, true, false); jfreechart.addSubtitle(new TextTitle("By Programming Language")); jfreechart.addSubtitle(new TextTitle("As at 5 March 2003")); jfreechart.setBackgroundPaint(Color.white); CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot(); categoryplot.setBackgroundPaint(Color.lightGray); categoryplot.setRangeGridlinePaint(Color.white); CategoryAxis categoryaxis = categoryplot.getDomainAxis(); categoryaxis.setLowerMargin(0.02D); categoryaxis.setUpperMargin(0.02D); categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis(); numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer(); NumberAxis numberaxis1 = new NumberAxis("Percent"); numberaxis1.setNumberFormatOverride(NumberFormat.getPercentInstance()); categoryplot.setRangeAxis(1, numberaxis1); categoryplot.setDataset(1, acategorydataset[1]); categoryplot.setRenderer(1, lineandshaperenderer); categoryplot.mapDatasetToRangeAxis(1, 1); categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); return jfreechart; } }
3.5 编译并运行
1)编译自定义函数
编译JFreeToChart.java类生成JFreeToChart.class文件拷贝至报表应用所在目录%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\function下。
2)注册自定义函数
启动设计器,点击服务器>函数管理器,新增函数取名为JFreeToChart,选择JFreeToChart.class类,如下图:
222
此时自定义函数便定义好了,您可以在设计器中使用该函数。
2)使用自定义函数

222

注:图表中使用的数据可以使用内置数据集,具体数据为模板预览中左侧的数据
如上图JFreeToChart图表数据由单元格扩展而来,在单元格中输入公式=JFreeToChart(A2,B2),便可以显示JFreeChart图表了。

注:通过设计器预览该模板之前,需要将jcommon-1.0.16.jar和jfreechart-1.0.13.jar这两个jar包放在%FR_HOME%\webapps\webroot\WEB-INF\lib下面,重启设计器之后,再预览。

3.6模板预览

分页预览,即可看到如下效果:
222