1. 安装fusionchart
Fusionchart核心文件如下图:
其中“charts”文件夹下是各种swf文件,“FusionChartsExportComponent.js”作用是导出图片或pdf时引用该文件。
2. Fusionchart简单使用流程
Fusionchart使用xml文件作为数据源读取数据,如下介绍一个简单的例子:
数据文件Column3D.xml
<chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='0' decimals='0' formatNumberScale='0'> <set label='Jan' value='462' /> <set label='Feb' value='857' /> <set label='Mar' value='671' /> <set label='Apr' value='494' /> <set label='May' value='761' /> <set label='Jun' value='960' /> <set label='Jul' value='629' /> <set label='Aug' value='622' /> <set label='Sep' value='376' /> <set label='Oct' value='494' /> </chart> |
展示文件Column3D.jsp
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" href="<%=request.getContextPath() %>/fcf/css/Style.css" type="text/css" /> <script language="JavaScript" src="<%=request.getContextPath() %>/fcf/js/FusionCharts.js"></script> </head>
<body> <div id="chartdiv" align="center"> FusionCharts. </div> <script type="text/javascript"> var chart = new FusionCharts("<%=request.getContextPath() %>/fcf/Charts/Column3D.swf", "ChartId", "600", "375", "0", "0"); chart.setDataURL("<%=request.getContextPath() %>/data/single/Column3D.xml"); chart.render("chartdiv"); </script> |
当访问该jsp时,即可展示报表
3. Fusionchart导出图片或pdf(客户端方式)
导出图片或pdf时,需要设这xml文件根节点,如下:
<chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='0' decimals='0' formatNumberScale='0' exportEnabled='1' exportAtClient='1' exportShowMenuItem='1' exportHandler='fcExporter1' showExportDialog='1' exportDialog='please waiting...' exportDialogColor='ff0000' exportFormats='PDF=Export as PDF|PNG=Export as PNG|jpg=Export as JPG' > 数据不变………… |
上述红色加粗字段为客户端导出图片必须的属性。
Column3D.jsp中需要添加内容:
<head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>FusionCharts v3 Documentation</title> <link rel="stylesheet" href="<%=request.getContextPath() %>/fcf/css/Style.css" type="text/css" /> <script language="JavaScript" src="<%=request.getContextPath() %>/fcf/js/FusionCharts.js"></script> //新引入该js文件 <script language="JavaScript" src="<%=request.getContextPath() %>/fcf/js/FusionChartsExportComponent.js"></script> </head> <div id="chartdiv" align="center"> FusionCharts. </div> <script type="text/javascript"> var chart = new FusionCharts("<%=request.getContextPath() %>/fcf/Charts/Column3D.swf", "ChartId", "600", "375", "0", "1"); chart.setDataURL("<%=request.getContextPath() %>/data/single/Column3D.xml"); chart.render("chartdiv"); </script> //从此处开始……新增div 存储导出按钮 <div id="fcexpDiv" align="center" style="text-align:center; width:100%;"> FusionCharts Export Handler Component </div> <script type="text/javascript"> //设置导出的保存按钮 var myExportComponent = new FusionChartsExportObject("fcExporter1", "<%=request.getContextPath() %>/fcf/Charts/FCExporter.swf"); myExportComponent.componentAttributes.width = '1024'; myExportComponent.componentAttributes.height = '60'; //Background color myExportComponent.componentAttributes.bgColor = 'ffffdd'; //Border properties myExportComponent.componentAttributes.borderThickness = '2'; myExportComponent.componentAttributes.borderColor = '0372AB'; //Font properties myExportComponent.componentAttributes.fontFace = 'Arial'; myExportComponent.componentAttributes.fontColor = '0372AB'; myExportComponent.componentAttributes.fontSize = '12'; //Message - caption of export component myExportComponent.componentAttributes.showMessage = '1'; myExportComponent.componentAttributes.message = '先右击图表导出,再点击下边按钮进行保存.'; //Button visual configuration myExportComponent.componentAttributes.btnWidth = '200'; myExportComponent.componentAttributes.btnHeight= '25'; myExportComponent.componentAttributes.btnColor = 'E1f5ff'; myExportComponent.componentAttributes.btnBorderColor = '0372AB'; //Button font properties myExportComponent.componentAttributes.btnFontFace = 'Verdana'; myExportComponent.componentAttributes.btnFontColor = '0372AB'; myExportComponent.componentAttributes.btnFontSize = '15'; //Title of button myExportComponent.componentAttributes.btnsavetitle = '保存图表或pdf'; myExportComponent.componentAttributes.btndisabledtitle = '等待导出...'; myExportComponent.Render("fcexpDiv"); </script> |
注意:需要将:
var chart = new FusionCharts("<%=request.getContextPath() %>/fcf/Charts/Column3D.swf", "ChartId", "600", "375", "0", "0"); 最后的0改成1
注意下面两个参数,参数一是对应xml根节点中的exportHandler属性,参数二是charts文件夹下的文件 var myExportComponent = new FusionChartsExportObject("fcExporter1", "<%=request.getContextPath() %>/fcf/Charts/FCExporter.swf"); |
这时,展示的报表为:
可以看见下方有个按钮,目前不能点击,当在报表上右键选择导出某一选项时,会弹出进度条:
进度条读取完毕,即可点击按钮,将图片或pdf保存到本地
4. Fusionchart导出图片或pdf(服务器方式)
据说服务器方式占用资源较大,但是好处是可以将图片或pdf保存在服务器内某处,以后用到可以下载,也可以整合到word中。现在介绍下:
第一步,从下载的fusionchart完整压缩包中取出本项目所使用到的jsp和jar包如下图:
将该jar放入项目lib下,将该jsp文件夹放入项目fusionchart下如图:
第二步,从下载的fusionchart完整压缩包中取出本项目所使用到的fusionchart配置文件:
将该配置文件放入项目配置文件目录:
内容修改如下:
#没发现用处 EXPORTHANDLER=FCExporter_ #FCExporter_IMG.jsp and FCExporter_PDF.jsp 两个文件路径 RESOURCEPATH=/fcf/JSP/Resources/ #输出 SAVEPATH=./images/fcfImage/ # 没发现它的用处 HTTP_URI=http://localhost:8080/FCReport/images/fcfImage/
#若文件重名是否覆盖 OVERWRITEFILE=false INTELLIGENTFILENAMING=true FILESUFFIXFORMAT=TIMESTAMP |
第三步,修改Xml文件根节点如下:
<chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='0' decimals='0' formatNumberScale='0' exportEnabled='1' exportAtClient='0' exportShowMenuItem='1' exportCallback='FC_Exported' exportAction='save' exportHandler='../../../fcf/JSP/FCExporter.jsp' showExportDialog='1' exportDialog='please waiting...' exportDialogColor='ff0000' exportFormats='PDF=Export as PDF|PNG=Export as PNG|JPEG=Export as JPEG|JPG=Export as JPG' > 数据………… |
解释:
exportEnabled 代表是否允许导出
exportAtClient 代表是否使用客户端方式导出0代表不使用,1代表使用
exportCallback 代表操作执行完毕后 回调函数名称(FC_Exported)jsp内
exportAction 代表将文件下载或存入服务器路径 若值为save则存储,值为download则下载
exportFormats 代表允许导出的类型 右键可见
第五步,修改jsp,添加回调函数(非必须,只是为了save方式执行完毕有个提示)
<script type="text/javascript"> var chart = new FusionCharts("<%=request.getContextPath() %>/fcf/Charts/Column3D.swf", "ChartId", "600", "375", "0", "1"); chart.setDataURL("<%=request.getContextPath() %>/data/single/Column3D_s.xml"); chart.render("chartdiv"); //回调函数 function FC_Exported(objRtn) { if (objRtn.statusCode == "1") { alert("保存成功"); } else { alert("保存失败: " + objRtn.statusMessage + ". Its DOM Id is " + objRtn.DOMId); } } </script> |
5. 使用动态数据源(java生成xml)
这里只介绍请求到来后生成xml文档格式并将其转换成长字符串的代码:
package com.admin.util;
import java.io.ByteArrayOutputStream; import java.util.HashMap; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter;
public class XmlUtil {
/** * 创建根 * @param args */ public static Element createRoot(Map<String,String>attributesMap){ //创建document对象 Document doc = DocumentHelper.createDocument(); //创建根"chart" 一级节点 Element chart = doc.addElement("chart"); //循环map 设置根的多个属性 for(String name:attributesMap.keySet()){ //eg: caption='3D图例' chart.addAttribute(name, attributesMap.get(name)); } return chart; }
/** * 简单的xml单系列图使用 * @param args */ public static void setSingleElement(Element root,Map<String,String>attributesMap){ // 二级节点 Element set = root.addElement("set"); for(String name:attributesMap.keySet()){ //<set label='Jan' value='462' /> set.addAttribute(name, attributesMap.get(name)); } }
/** * 多系列图首先设置categories属性 * @param args */ public static void setCategoryElement(Element root,Map<String,String>attributesMap,String[]values){
//创建<categories> 二级节点 Element categories = root.addElement("categories");
//设置categories的属性 for(String name:attributesMap.keySet()){ categories.addAttribute(name, attributesMap.get(name)); }
//创建多个<category name='Austria' /> 三级节点 for(String value:values){ Element category = categories.addElement("category");
category.addAttribute("name", value); } }
/** * 多系列图首先设置dataset属性 * @param args */ public static void setDatasetElement(Element root,Map<String,String>attributesMap,String[]values){
//创建<dataset> 二级节点 Element dateset = root.addElement("dataset");
//设置dataset属性 seriesName='1996' color='AFD8F8' showValues='0' for(String name:attributesMap.keySet()){ dateset.addAttribute(name, attributesMap.get(name)); }
//创建多个<set value='25601.34' /> 三级节点 for(String value:values){ Element set = dateset.addElement("set"); set.addAttribute("value", value); } }
/** * 将xml转换成String * @param root * @return */ public static String finalStringByRoot(Element root){ String str = ""; try { // 使用输出流来进行转化 ByteArrayOutputStream out = new ByteArrayOutputStream(); // 使用UTF-8编码--false 换行 OutputFormat format = new OutputFormat("", true, "UTF-8"); XMLWriter writer = new XMLWriter(out, format); writer.write(root.getDocument()); str = out.toString("UTF-8"); } catch (Exception ex) { ex.printStackTrace(); } return str; }
public static void main(String[] args) {
//创建根 Map<String,String> rootAttributeMap=new HashMap<String,String>(); rootAttributeMap.put("caption", "每月销售额柱形图");//主标题 rootAttributeMap.put("subcaption", "2006-2007");//符标题 rootAttributeMap.put("xAxisName", "月份");//x轴名称 rootAttributeMap.put("yAxisName", "units");//Y轴名称免费版不支持中文显示 rootAttributeMap.put("decimalPrecision", "0");
Element root = createRoot(rootAttributeMap);
//简单的单个系列图 /* Map<String,String> singeAttributeMap=new HashMap<String,String>();
for(int i=1;i<=12;i++){ singeAttributeMap.put("name", i+"月");
Random r=new Random(); int value=r.nextInt(30000); singeAttributeMap.put("value", String.valueOf(value));
setSingleElement(root, singeAttributeMap); }*/
//多系列图 Category Map<String,String> categoryAttributeMap=new HashMap<String,String>(); categoryAttributeMap.put("fontColor", "000000");
String[] categoryValues = {"china","usa","uk","japan"}; setCategoryElement(root,categoryAttributeMap,categoryValues);
//多系列图 Dataset Map<String,String> datasetAttributeMap=new HashMap<String,String>(); datasetAttributeMap.put("seriesName", "2006"); String[] datasetValues0 = {"10000","7000","8000","3000"}; setDatasetElement(root,datasetAttributeMap,datasetValues0);
datasetAttributeMap.put("seriesName", "2007"); String[] datasetValues1 = {"10000","7000","8000","3000"}; setDatasetElement(root,datasetAttributeMap,datasetValues1);
datasetAttributeMap.put("seriesName", "2008"); String[] datasetValues2 = {"10000","7000","8000","3000"}; setDatasetElement(root,datasetAttributeMap,datasetValues2);
//输出 System.out.println(finalStringByRoot(root));
} } |
运行main方法输出的内容为:
<?xml version="1.0" encoding="UTF-8"?>
<chart xAxisName="月份" decimalPrecision="0" subcaption="2006-2007" caption="每月销售额柱形图" yAxisName="units"> <categories fontColor="000000"> <category name="china"/> <category name="usa"/> <category name="uk"/> <category name="japan"/> </categories> <dataset seriesName="2006"> <set value="10000"/> <set value="7000"/> <set value="8000"/> <set value="3000"/> </dataset> <dataset seriesName="2007"> <set value="10000"/> <set value="7000"/> <set value="8000"/> <set value="3000"/> </dataset> <dataset seriesName="2008"> <set value="10000"/> <set value="7000"/> <set value="8000"/> <set value="3000"/> </dataset> </chart> |
将此报文传入fusionchart前,需要将其加密处理:
String content = XmlUtil.finalStringByRoot(root); System.out.println(content); content = java.net.URLEncoder.encode(content, "utf-8"); |
并且,jsp页面接收内容的方法为:
var chart = new FusionCharts("<%=request.getContextPath() %>/fcf/Charts/Column2D.swf", "ChartId", "400", "275", "0", "0"); chart.setDataXML("${content}"); chart.render("chartdiv"); |