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

1. 问题描述编辑

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

2. 解决方案编辑

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

3. 示例编辑

3.1 创建一个表格数据源(dataset)
  1. private CategoryDataset[] createDatasets(){里面通过单元格扩展出来的数据定义图表的数据源}  
3.2 由ChartFactory 产生 JFreeChart 对象
  1. private JFreeChart createChart(CategoryDataset acategorydataset[]){设置图表的一些属性}  
3.3 把jFreeChart图表输出成图片
  1. private BufferedImage createImage(int width, int height) {  
  2.         CategoryDataset acategorydataset[] = createDatasets();  
  3.         JFreeChart jfreechart = createChart(acategorydataset);  
  4.         return jfreechart.createBufferedImage(width, height);  
  5.     }  
3.4 完整代码如下
  1. package com.fr.function;    
  2.     
  3. import java.awt.Color;    
  4. import java.awt.image.BufferedImage;    
  5. import java.text.NumberFormat;    
  6. import org.jfree.chart.ChartFactory;    
  7. import org.jfree.chart.JFreeChart;    
  8. import org.jfree.chart.axis.CategoryAxis;    
  9. import org.jfree.chart.axis.CategoryLabelPositions;    
  10. import org.jfree.chart.axis.NumberAxis;    
  11. import org.jfree.chart.plot.CategoryPlot;    
  12. import org.jfree.chart.plot.DatasetRenderingOrder;    
  13. import org.jfree.chart.plot.PlotOrientation;    
  14. import org.jfree.chart.renderer.category.LineAndShapeRenderer;    
  15. import org.jfree.chart.title.TextTitle;    
  16. import org.jfree.data.DataUtilities;    
  17. import org.jfree.data.DefaultKeyedValues;    
  18. import org.jfree.data.category.CategoryDataset;    
  19. import org.jfree.data.general.DatasetUtilities;    
  20. import org.jfree.util.SortOrder;    
  21.     
  22. import com.fr.script.AbstractFunction;    
  23.     
  24. public class JFreeToChart extends AbstractFunction {    
  25.     private String x, y;    
  26.     
  27.     public Object run(Object[] args) {    
  28.         this.x = args[0].toString();    
  29.         this.y = args[1].toString();    
  30.         BufferedImage image = createImage(600400);    
  31.         return image;    
  32.     }    
  33.     
  34.     private BufferedImage createImage(int width, int height) {    
  35.         CategoryDataset acategorydataset[] = createDatasets();    
  36.         JFreeChart jfreechart = createChart(acategorydataset);    
  37.         return jfreechart.createBufferedImage(width, height);    
  38.     }    
  39.     
  40.     private CategoryDataset[] createDatasets() {    
  41.         DefaultKeyedValues defaultkeyedvalues = new DefaultKeyedValues();    
  42.         String[] xValue = this.x.split(",");    
  43.         String[] yValue = this.y.split(",");    
  44.         for (int i = 0; i < xValue.length; i++) {    
  45.             defaultkeyedvalues.addValue(xValue[i], Double.valueOf(yValue[i]));    
  46.         }    
  47.         defaultkeyedvalues.sortByValues(SortOrder.DESCENDING);    
  48.         org.jfree.data.KeyedValues keyedvalues = DataUtilities    
  49.                 .getCumulativePercentages(defaultkeyedvalues);    
  50.         CategoryDataset categorydataset = DatasetUtilities    
  51.                 .createCategoryDataset("Languages", defaultkeyedvalues);    
  52.         CategoryDataset categorydataset1 = DatasetUtilities    
  53.                 .createCategoryDataset("Cumulative", keyedvalues);    
  54.         return (new CategoryDataset[] { categorydataset, categorydataset1 });    
  55.     
  56.     }    
  57.     
  58.     private JFreeChart createChart(CategoryDataset acategorydataset[]) {    
  59.         JFreeChart jfreechart = ChartFactory.createBarChart(    
  60.                 "Freshmeat Software Projects""Language""Projects",    
  61.                 acategorydataset[0], PlotOrientation.VERTICAL, truetrue,    
  62.                 false);    
  63.         jfreechart.addSubtitle(new TextTitle("By Programming Language"));    
  64.         jfreechart.addSubtitle(new TextTitle("As at 5 March 2003"));    
  65.         jfreechart.setBackgroundPaint(Color.white);    
  66.         CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();    
  67.         categoryplot.setBackgroundPaint(Color.lightGray);    
  68.         categoryplot.setRangeGridlinePaint(Color.white);    
  69.         CategoryAxis categoryaxis = categoryplot.getDomainAxis();    
  70.         categoryaxis.setLowerMargin(0.02D);    
  71.         categoryaxis.setUpperMargin(0.02D);    
  72.         categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);    
  73.         NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();    
  74.         numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());    
  75.         LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();    
  76.         NumberAxis numberaxis1 = new NumberAxis("Percent");    
  77.         numberaxis1.setNumberFormatOverride(NumberFormat.getPercentInstance());    
  78.         categoryplot.setRangeAxis(1, numberaxis1);    
  79.         categoryplot.setDataset(1, acategorydataset[1]);    
  80.         categoryplot.setRenderer(1, lineandshaperenderer);    
  81.         categoryplot.mapDatasetToRangeAxis(11);    
  82.         categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);    
  83.         return jfreechart;    
  84.     }    
  85. }  
注:最新的代码链接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下面,重启设计器之后,再预览。