目前版本的ireport提供的可视化报表设计界面上无此功能,同时jasperreports也没有实现.
需要修改的几个Class:
1)net.sf.jasperreports.engine.fill.JRBaseFiller
通过这个Class传递一些用户设定的参数
增加一个参数:表示是否需要在图形报表中加超连接
修改的代码如下:
a)实例变量中加上:
protected boolean isNeedHref;
b)在protected void setParameters(Map parameterValues) throws JRException这个方法中加上:
if(parameterValues.get(JRParameter.IS_NEED_HREF)!=null){ isNeedHref=((Boolean)parameterValues.get(JRParameter.IS_NEED_HREF)).booleanValue(); }
JRParameter.IS_NEED_HREF这个是新增的
c)增加一个方法
protected boolean isNeedHref(){ return isNeedHref; }
2)net.sf.jasperreports.engine.fill.JRFillChart
这个Class负责调用jfreechart产生图表
将evaluate***Image()方法中调用ChartFactory.createBarChart()的最后一个参数改为filler.isNeedHref ()
3)net.sf.jasperreports.engine.export.JRHtmlExporter
这个Class负责输出html格式的报表
a)增加一个实例变量:
protected boolean isWriteImageMap = false;
当我们的程式传递参数的时候可以选择是否产生Image Map的动作
b) 修改方法public void exportReport() throws JRException :
增加如下代码:
Boolean isWriteImageMapParameter = (Boolean)parameters.get(JRExporterParameter.IS_WRITE_IMAGE_MAP); if (isWriteImageMapParameter != null){ isWriteImageMap = isWriteImageMapParameter.booleanValue(); }
JRExporterParameter.IS_WRITE_IMAGE_MAP这个也是新增的
c)修改方法protected void exportImage(JRPrintImage image, JRExporterGridCell gridCell):
方法的第一行加两个String变量:
String mapString = ""; String mapName = "";
在代码imagePath = imagesURI + imageName;后一行加上
if(isWriteImageMap&&renderer instanceof JCommonDrawableRenderer){ JFreeChart o = ((JCommonDrawableRenderer)renderer).getJFreeChart(); if(o!=null){ ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); try { ServletUtilities.saveChartAsJPEG(o, image.getWidth() , image.getHeight(), info, null); mapName = "Map"+imageName; mapString = ChartUtilities.getImageMap("Map"+imageName, info ,new StandardToolTipTagFragmentGenerator(),new StandardURLTagFragmentGenerator ()); mapName = " usemap=\"#"+mapName+"\" "; } catch (Exception e1) { e1.printStackTrace(); } } }
最后将该方法的最后几行代码
writer.write(" alt=\"\"/>"); if (href != null){ writer.write(""); } writer.write("\n");
改为
writer.write(" alt=\"\""+mapName+"/>"); if (href != null){ writer.write(""); } writer.write("\n"); if(mapString!=null&&mapString.trim().length()>0) writer.write(mapString+"\n");
也可以自己去实现org.jfree.chart.imagemap.URLTagFragmentGenerator 这个接口,然后替换掉
StandardURLTagFragmentGenerator,决定超连接的方式,可以是我们自己定义的javascript方法等等.
当我们的自己的程式需要产生带超连接的图形报表时,在程式中需要这样做:
parameters.put(JRParameter.IS_NEED_HREF, Boolean.valueOf(true)); exporter.setParameter(JRHtmlExporterParameter.IS_WRITE_IMAGE_MAP,Boolean.valueOf(true));
付上一个产生出的html图形报表样本