如何通过jasperreports/jfreechart在产生的图形报表(html方式)中加入超连接

通过产生Image Map的方式实现图片上相应区域的超连接
目前版本的ireport提供的可视化报表设计界面上无此功能,同时jasperreports也没有实现.
需要修改的几个Class:
1)net.sf.jasperreports.engine.fill.JRBaseFiller
通过这个Class传递一些用户设定的参数
增加一个参数:表示是否需要在图形报表中加超连接
修改的代码如下:
a)实例变量中加上:
[code]protected boolean isNeedHref;[/code]
b)在protected void setParameters(Map parameterValues) throws JRException这个方法中加上:

[code]if(parameterValues.get(JRParameter.IS_NEED_HREF)!=null){
isNeedHref=((Boolean)parameterValues.get(JRParameter.IS_NEED_HREF)).booleanValue();
}[/code]
[color=red]JRParameter.IS_NEED_HREF[/color]这个是新增的

c)增加一个方法

[code]protected boolean isNeedHref(){
return isNeedHref;
}[/code]
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)增加一个实例变量:

[code]protected boolean isWriteImageMap = false;[/code]

当我们的程式传递参数的时候可以选择是否产生Image Map的动作
b) 修改方法public void exportReport() throws JRException :
增加如下代码:

[code]Boolean isWriteImageMapParameter = (Boolean)parameters.get(JRExporterParameter.IS_WRITE_IMAGE_MAP);
if (isWriteImageMapParameter != null){
isWriteImageMap = isWriteImageMapParameter.booleanValue();
}[/code]

[color=red]JRExporterParameter.IS_WRITE_IMAGE_MAP[/color]这个也是新增的

c)修改方法protected void exportImage(JRPrintImage image, JRExporterGridCell gridCell):
方法的第一行加两个String变量:

[code]String mapString = "";
String mapName = "";[/code]


[color=blue]在代码imagePath = imagesURI + imageName;后一行加上[/color]

[code]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();
}
}
}[/code]

最后将该方法的最后几行代码

[code]writer.write(" alt=\"\"/>");
if (href != null){
writer.write("</a>");
}
writer.write("</td>\n");[/code]

[color=red]改为[/color]

[code]writer.write(" alt=\"\""+mapName+"/>");
if (href != null){
writer.write("</a>");
}
writer.write("</td>\n");
if(mapString!=null&&mapString.trim().length()>0)
writer.write(mapString+"\n");[/code]


也可以自己去实现org.jfree.chart.imagemap.URLTagFragmentGenerator 这个接口,然后替换掉
StandardURLTagFragmentGenerator,决定超连接的方式,可以是我们自己定义的javascript方法等等.

当我们的自己的程式需要产生带超连接的图形报表时,在程式中需要这样做:

[code]parameters.put(JRParameter.IS_NEED_HREF, Boolean.valueOf(true));
exporter.setParameter(JRHtmlExporterParameter.IS_WRITE_IMAGE_MAP,Boolean.valueOf(true));[/code]

付上一个产生出的html图形报表样本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值