历史版本2 :引入JFreeChart图表 返回文档
编辑时间:
内容长度:图片数:目录数:
修改原因:
1. 问题描述编辑
JFreeChart是JAVA平台上很好的一个开放图表绘制类库,不但可以生成多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。所以希望在我们报表工具可以直接引入第三方JFreeChart的图表,使用报表单元格数据,如下图效果:

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;
- }
- }
注:最新的代码链接fine-help。
注:在eclipse中导入第三方包jcommon-1.0.16.jar和jfreechart-1.0.13.jar,如果没有可以直接在网站下载或咨询我们技术支持。导入第三方包可参考文档引用第三方jar包。
3.5 编译并运行
- 编译自定义函数
编译JFreeToChart.java类生成JFreeToChart.class文件拷贝至报表应用所在目录/WEB-INF/classes/com/fr/function下。
- 注册自定义函数
启动设计器,点击服务器|函数管理器,新增函数取名为JFreeToChart,选择JFreeToChart.class类,如下图:

此时自定义函数便定义好了,您可以在设计器中使用该函数。
- 使用自定义函数

如上图JFreeToChart图表数据由单元格扩展而来,在单元格中输入公式=JFreeToChart(A2,B2),便可以显示JFreeChart图表了。
注:通过设计器预览该模板之前,需要将jcommon-1.0.16.jar和jfreechart-1.0.13.jar这两个jar包放在%FineReport-Home%\WebReport\WEB-INF\lib下面,重启设计器之后,再预览。