论坛首页 Java企业应用论坛

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

浏览 6264 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-23  
通过产生Image Map的方式实现图片上相应区域的超连接
目前版本的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("</a>");
}
writer.write("</td>\n");


改为

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");



也可以自己去实现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图形报表样本
  • temp.rar (33.3 KB)
  • 描述: 产生出的带Image Map的html图形报表样本
  • 下载次数: 532
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics