java怎么做报表功能
使用JFreeChart生成各种样式的图表
限于篇幅的问题我们在这里只实现两种常用的图表,其他类型图表读者可以触类旁通。我们先给出柱状图的实现,饼图的实现再来跟柱状图进行比较。
1柱状图
packagelius.chart.demo;
importjava.io.*;
importorg.jfree.data.*;
importorg.jfree.chart.*;
importorg.jfree.chart.plot.*;
/**
*该类用于演示最简单的柱状图生成
*@authorWinterLau
*/
publicclassBarChartDemo{
publicstaticvoidmain(String[]args)throwsIOException{
CategoryDatasetdataset=getDataSet2();
JFreeChartchart=ChartFactory.createBarChart3D(
水果产量图,//图表标题
水果,//目录轴的显示标签
产量,//数值轴的显示标签
dataset,//数据集
PlotOrientation.VERTICAL,//图表方向:水平、垂直
true,//是否显示图例(对于简单的柱状图必须是false)
false,//是否生成工具
false//是否生成URL链接
);
FileOutputStreamfos_jpg=null;
try{
fos_jpg=newFileOutputStream(D:\\fruit.jpg);
ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null);
}finally{
try{
fos_jpg.close();
}catch(Exceptione){}
}
}
/**
*获取一个演示用的简单数据集对象
*@return
*/
privatestaticCategoryDatasetgetDataSet(){
DefaultCategoryDatasetdataset=newDefaultCategoryDataset();
dataset.addValue(100,null,苹果);
dataset.addValue(200,null,梨子);
dataset.addValue(300,null,葡萄);
dataset.addValue(400,null,香蕉);
dataset.addValue(500,null,荔枝);
returndataset;
}
/**
*获取一个演示用的组合数据集对象
*@return
*/
privatestaticCategoryDatasetgetDataSet2(){
DefaultCategoryDatasetdataset=newDefaultCategoryDataset();
dataset.addValue(100,北京,苹果);
dataset.addValue(100,上海,苹果);
dataset.addValue(100,广州,苹果);
dataset.addValue(200,北京,梨子);
dataset.addValue(200,上海,梨子);
dataset.addValue(200,广州,梨子);
dataset.addValue(300,北京,葡萄);
dataset.addValue(300,上海,葡萄);
dataset.addValue(300,广州,葡萄);
dataset.addValue(400,北京,香蕉);
dataset.addValue(400,上海,香蕉);
dataset.addValue(400,广州,香蕉);
dataset.addValue(500,北京,荔枝);
dataset.addValue(500,上海,荔枝);
dataset.addValue(500,广州,荔枝);
returndataset;
}
}
2饼图
packagelius.chart.demo;
importjava.io.*;
importorg.jfree.data.*;
importorg.jfree.chart.*;
/**
*用于演示饼图的生成
*@authorWinterLau
*/
publicclassPieChartDemo{
publicstaticvoidmain(String[]args)throwsIOException{
DefaultPieDatasetdata=getDataSet();
JFreeChartchart=ChartFactory.createPie3DChart(水果产量图,//图表标题
data,
true,//是否显示图例
false,
false
);
//写图表对象到文件,参照柱状图生成源码
}
/**
*获取一个演示用的简单数据集对象
*@return
*/
privatestaticDefaultPieDatasetgetDataSet(){
DefaultPieDatasetdataset=newDefaultPieDataset();
dataset.setValue(苹果,100);
dataset.setValue(梨子,200);
dataset.setValue(葡萄,300);
dataset.setValue(香蕉,400);
dataset.setValue(荔枝,500);
returndataset;
}
}
3将生成的图表移到浏览器上
packagelius.chart.demo;
importjava.io.IOException;
importjavax.servlet.*;
importjavax.servlet.http.HttpServlet;
importorg.jfree.data.*;
importorg.jfree.chart.*;
/**
*演示通过servlet直接输出图表
*@authorWinterLau
*/
publicclassChartDemoServletextendsHttpServlet{
publicvoidservice(ServletRequestreq,ServletResponseres)
throwsServletException,IOException
{
res.setContentType(image/jpeg);
DefaultPieDatasetdata=getDataSet();
JFreeChartchart=ChartFactory.createPie3DChart(水果产量图,
data,
true,
false,
false
);
ChartUtilities.writeChartAsJPEG(res.getOutputStream(),
100,chart,400,300,null);
}
/**
*获取一个演示用的简单数据集对象
*@return
*/
privatestaticDefaultPieDatasetgetDataSet(){
DefaultPieDatasetdataset=newDefaultPieDataset();
dataset.setValue(苹果,100);
dataset.setValue(梨子,200);
dataset.setValue(葡萄,300);
dataset.setValue(香蕉,400);
dataset.setValue(荔枝,500);
returndataset;
}
}
4高级主题
很多情况我们不仅仅要求可以在浏览器上显示一个图表,我们更需要客户可以直接在图表上做一下交互的操作,例如获取信息提示,点击图表某个部分进行更详细信息的展示等等。例如前面生成的简单柱状图,用户需要在看到柱状图后点击某种水果例如是苹果即可看到各个地区苹果产量的情况。为此就要求该图形具有交互操作的功能。在HTML中为了让一个图像具有可交互的功能就必须给该图像定义一个Map对象。下表节选一段具有该功能的HTML代码:
<AREASHAPE=RECTCOORDS=81,15,126,254href=?series=0&category=100
title=100=7,048
onclick=javascript:clickChart('100');returnfalse;>
<AREASHAPE=RECTCOORDS=143,27,188,255href=?series=0&category=200
title=200=6,721
onclick=javascript:clickChart('200');returnfalse;>
<AREASHAPE=RECTCOORDS=205,54,250,255href=?series=0&category=300
title=300=5,929
onclick=javascript:clickChart('300');returnfalse;>
<AREASHAPE=RECTCOORDS=267,85,312,255href=?series=0&category=400
title=400=5,005
onclick=javascript:clickChart('400');returnfalse;>
<AREASHAPE=RECTCOORDS=329,17,374,255href=?series=0&category=Diet
title=Diet=7,017onclick=javascript:
clickChart('Diet');returnfalse;>
由此就产生了一个问题:如果根据一个图像来生成对应的MAP对象。我们回头看看刚才的代码,在创建一个图表对象时候有两个参数,我们举柱状图的例子来讲这两个参数就是ChartFactory.createBarChart3D方法中的最后两个参数,这两个参数的类型都是布尔值。这两个参数意思分别是:是否创建工具提示(tooltip)以及是否生成URL。这两个参数分别对应着MAP中一个AREA的title属性以及href属性。
可是我想知道的是怎么来产生这个MAP啊!哈哈,不要着急,JFreeChart已经帮我们做好生成MAP对象的功能。为了生成MAP对象就要引入另外一个对象:ChartRenderingInfo。因为JFreeChart没有直接的方法利用一个图表对象直接生成MAP数据,它需要一个中间对象来过渡,这个对象就是ChartRenderingInfo。
免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。
如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!
新励学网教育平台
海量全面 · 详细解读 · 快捷可靠
累积科普文章数:18,862,126篇