转自:http://sarin.iteye.com/blog/711494
首次看到Fusion Charts是在Bug Free上,有个统计功能,看到了这个数据报表,也是Flash实现的,和Open Flash Chart类似,但是数据格式完全不同。OFC使用JSON数据,而Fusion Chart使用XML数据,OFC是单文件的,而FC是多文件(不同的Flash显示不同类型的报表)。Fusion Charts的官方网站是http://www.fusioncharts.com/free ,可以下载开发包和查看示例。下载Fusion Charts Free后的开发包内有swf文件,示例代码和支持的JS文件。我们只要swf和js即可,开发环境自行搭建,非常简单,注意这里我们使用免费的Fusion Charts Free。
因为Fusion Charts的数据源是XML格式,那么就要准备生成XML的API,这有很多选择,如JDOM,DOM4J都不错。因为Hibernate默认只用了Dom4J来解析XML,那么为了避免过多引入JAR依赖,就使用Dom4j来生成XML文本。下面先对Dom4j做个初步的封装,使得使用起来方便一些。
- package org.xxx.core.util;
-
-
import java.io.IOException;
-
import org.dom4j.Document;
-
import org.dom4j.DocumentHelper;
-
import org.dom4j.Element;
-
-
-
-
-
-
-
public class XMLUtil {
-
private Document document = null;
-
-
public Document getDocument() {
-
return document;
- }
-
-
-
-
public XMLUtil() {
- document = DocumentHelper.createDocument();
- }
-
-
-
-
-
-
-
public Element addRoot(String rootName) {
- Element root = document.addElement(rootName);
-
return root;
- }
-
-
-
-
-
-
-
-
public Element addNode(Element parentElement, String elementName) {
- Element node = parentElement.addElement(elementName);
-
return node;
- }
-
-
-
-
-
-
-
-
public void addAttribute(Element thisElement, String attributeName,
- String attributeValue) {
- thisElement.addAttribute(attributeName, attributeValue);
- }
-
-
-
-
-
-
-
-
public void addAttributes(Element thisElement, String[] attributeNames, String[] attributeValues) {
-
for (int i = 0; i < attributeNames.length; i++) {
- thisElement.addAttribute(attributeNames[i], attributeValues[i]);
- }
- }
-
-
-
-
-
-
-
public void addText(Element thisElement, String text) {
- thisElement.addText(text);
- }
-
-
-
-
-
-
-
public String getXML() {
-
return document.asXML().substring(39);
- }
- }
package org.xxx.core.util;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
/**
* 使用dom4j生成XML工具类
*
* @author Sarin
*
*/
public class XMLUtil {
private Document document = null;
public Document getDocument() {
return document;
}
/**
* 构造方法,初始化Document
*/
public XMLUtil() {
document = DocumentHelper.createDocument();
}
/**
* 生成根节点
*
* @param rootName
* @return
*/
public Element addRoot(String rootName) {
Element root = document.addElement(rootName);
return root;
}
/**
* 生成节点
*
* @param parentElement
* @param elementName
* @return
*/
public Element addNode(Element parentElement, String elementName) {
Element node = parentElement.addElement(elementName);
return node;
}
/**
* 为节点增加一个属性
*
* @param thisElement
* @param attributeName
* @param attributeValue
*/
public void addAttribute(Element thisElement, String attributeName,
String attributeValue) {
thisElement.addAttribute(attributeName, attributeValue);
}
/**
* 为节点增加多个属性
*
* @param thisElement
* @param attributeNames
* @param attributeValues
*/
public void addAttributes(Element thisElement, String[] attributeNames, String[] attributeValues) {
for (int i = 0; i < attributeNames.length; i++) {
thisElement.addAttribute(attributeNames[i], attributeValues[i]);
}
}
/**
* 增加节点的值
*
* @param thisElement
* @param text
*/
public void addText(Element thisElement, String text) {
thisElement.addText(text);
}
/**
* 获取最终的XML
*
* @return
* @throws IOException
*/
public String getXML() {
return document.asXML().substring(39);
}
}
获取的XML因为包含声明,而Fusion Chart中不需要,所以这里就从根标记处开始截取。下面来看看Fusion Chart解析XML的格式。取自官方网站的一个示例:
- <graph yAxisName='Sales Figure' caption='Top 5 Sales Person' numberPrefix='$' decimalPrecision='1' divlinedecimalPrecision='0' limitsdecimalPrecision='0'>
-
<set name='Alex' value='25000' color='AFD8F8'/>
-
<set name='Mark' value='35000' color='F6BD0F'/>
-
<set name='David' value='42300' color='8BBA00'/>
-
<set name='Graham' value='35300' color='FF8E46'/>
-
<set name='John' value='31300' color='008E8E'/>
-
</graph>
<graph yAxisName='Sales Figure' caption='Top 5 Sales Person' numberPrefix='$' decimalPrecision='1' divlinedecimalPrecision='0' limitsdecimalPrecision='0'>
<set name='Alex' value='25000' color='AFD8F8'/>
<set name='Mark' value='35000' color='F6BD0F'/>
<set name='David' value='42300' color='8BBA00'/>
<set name='Graham' value='35300' color='FF8E46'/>
<set name='John' value='31300' color='008E8E'/>
</graph>
根标记是graph,其中有可配置的属性,可以参考官方文档,这里不详细列出了。单分类报表中使用set子标记作为数据,下面来看一个具体的数据源生成方法,使用了Struts2作为Web框架来处理请求。
- package org.xxx.app.action;
-
-
import java.util.HashMap;
-
import java.util.List;
-
import java.util.Map;
-
import org.dom4j.Element;
-
import org.xxx.core.util.XMLUtil;
-
-
public class ChartAction extends BaseAction {
-
private String xmlStr;
-
-
public String getXmlStr() {
-
return xmlStr;
- }
-
public String chart() throws Exception {
-
XMLUtil xml = new XMLUtil();
-
Element graph = xml.addRoot("graph");
-
xml.addAttribute(graph, "caption", "访问统计");
-
xml.addAttribute(graph, "subCaption", "浏览器类型统计");
-
xml.addAttribute(graph, "basefontsize", "12");
-
xml.addAttribute(graph, "xAxisName", "浏览器类型");
-
xml.addAttribute(graph, "decimalPrecision", "0");
-
xml.addAttribute(graph, "showValues", "0");
-
List browserList = getServMgr().getChartService().getStatsByType("browser");
-
for (int i = 0; i < browserList.size(); i++) {
- Map item = (HashMap) browserList.get(i);
-
Element set = xml.addNode(graph, "set");
-
set.addAttribute("name", (String) item.get("statVar"));
-
set.addAttribute("value", item.get("statCount").toString());
-
set.addAttribute("color", Integer.toHexString(
-
(int) (Math.random() * 255 * 255 * 255)).toUpperCase());
- }
- xmlStr = xml.getXML();
-
return "chart";
- }
- }
package org.xxx.app.action;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Element;
import org.xxx.core.util.XMLUtil;
public class ChartAction extends BaseAction {
private String xmlStr;
public String getXmlStr() {
return xmlStr;
}
public String chart() throws Exception {
XMLUtil xml = new XMLUtil();
Element graph = xml.addRoot("graph");
xml.addAttribute(graph, "caption", "访问统计");
xml.addAttribute(graph, "subCaption", "浏览器类型统计");
xml.addAttribute(graph, "basefontsize", "12");
xml.addAttribute(graph, "xAxisName", "浏览器类型");
xml.addAttribute(graph, "decimalPrecision", "0");// 小数精确度,0为精确到个位
xml.addAttribute(graph, "showValues", "0");// 在报表上不显示数值
List browserList = getServMgr().getChartService().getStatsByType("browser");
for (int i = 0; i < browserList.size(); i++) {
Map item = (HashMap) browserList.get(i);
Element set = xml.addNode(graph, "set");
set.addAttribute("name", (String) item.get("statVar"));
set.addAttribute("value", item.get("statCount").toString());
set.addAttribute("color", Integer.toHexString(
(int) (Math.random() * 255 * 255 * 255)).toUpperCase());
}
xmlStr = xml.getXML();
return "chart";
}
}
数据的获取使用了Spring的JdbcTemplate来进行,方法如下:
- private static final String SQL_GET_STATS = "select statVar,statCount from stats where statType=?";
-
public List getStatsByType(String type) {
-
return jt.queryForList(SQL_GET_STATS, new Object[] { type });
private static final String SQL_GET_STATS = "select statVar,statCount from stats where statType=?";
public List getStatsByType(String type) {
return jt.queryForList(SQL_GET_STATS, new Object[] { type });
}
数据表的结构可以参考http://sarin.iteye.com/admin/blogs/685354这篇,因为相同的演示,就用了同一个表结构。获取到数据遍历之后,就要在页面进行输出显示了,也很简单,页面如下:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
<title>Fusion Chart Test</title>
-
<script type="text/javascript" src="${base}/js/FusionCharts.js"></script>
-
</head>
-
<body>
-
<div id="chartDiv"></div>
-
<script type="text/javascript">
-
var chart = new FusionCharts("${base}/charts/FCF_Column3D.swf", "0", "800", "600");
- chart.setDataXML('${xmlStr}');
- chart.render('chartDiv');
-
</script>
-
-
</body>
-
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Fusion Chart Test</title>
<script type="text/javascript" src="${base}/js/FusionCharts.js"></script>
</head>
<body>
<div id="chartDiv"></div>
<script type="text/javascript">
var chart = new FusionCharts("${base}/charts/FCF_Column3D.swf", "0", "800", "600");
chart.setDataXML('${xmlStr}');
chart.render('chartDiv');
</script>
</body>
</html>
使用setDataXML()方法获取传递过来的xmlStr,就是我们需要的XML数据。简单的报表这样就可以了。如果是多类别报表,只是在XML格式上有所不同,参考官方示例,重新编写XML即可。下面来看看生成的报表,非常的不错。
希望对使用者有用,欢迎交流。
分享到:
相关推荐
Charts4J是一个轻量级的Java库,专为在Web应用程序中生成高质量的图表而设计。这个库的主要目的是简化在网页上展示数据的过程,通过提供简单易用的API,开发者可以快速创建各种类型的图表,如柱状图、饼图、线图等。...
jscharts生成报表,有柱状和饼状还有线状,可以根据自己的需求动态同过json或者xml来生成数据
标题中的“无logo无图标”意味着这个报表系统在生成的图表上不会带有JSCharts的标识或任何其他不必要的图标,使得用户可以更自由地定制和嵌入图表到自己的应用中,保持品牌一致性。 **一、JSCharts3报表实例** JS...
Fusion charts 目前最新版本 v3.3.1. 下载下来后 直接覆盖 trail 版的 charts. 可以 打开 debug mode 看一下 版本号
在压缩包文件“FusionChartsFree”中,可能包含了该框架的库文件、示例代码、文档和其他资源,这些资源对于学习和使用Fusion Charts Free非常有价值。通过研究这些文件,开发者可以深入理解其工作原理,并快速应用到...
- **结合使用**:利用JavaScript动态生成XML数据,并通过`setDataXML()`方法加载到图表中。 - **实时更新**:支持根据用户操作实时更新图表数据。 **5.3 SETDATAXML()方法的问题** - **兼容性**:在不同浏览器中的...
虽然Qt4已经有些过时,但了解如何使用它对理解QtCharts的基础概念仍然很有帮助,特别是对于那些从Qt4过渡到Qt5的开发者来说。 首先,我们需要确保已安装了QtCharts模块。在Qt Creator中,可以通过添加模块到项目...
1. 简单的API:Charts4j的API设计得易于理解和使用,使得开发者无需深入学习复杂的图形库即可创建图表。 2. 自定义选项:开发者可以通过设置各种参数来自定义图表的颜色、标签、标题等视觉元素,以适应不同的需求和...
标题"Fusion Charts Demo"指的是一个使用FusionCharts技术的演示项目,这是一款强大的数据可视化工具,常用于创建交互式图表和图形。FusionCharts能够处理各种类型的数据,并将其转化为易于理解的、美观的图表,适用...
在“flex charts 图形集合实例(读取XML)”中,我们探讨的是如何使用Flex Charts来展示数据,并且这些数据是从XML文件中读取的。XML因其结构化和可扩展性,常被用作数据交换格式。以下是对这一主题的详细说明: 1....
"maani XML/SWF Charts" 是一款基于PHP和Flash技术的图表生成工具,它能够创建出各种类型的图表,包括但不限于蜡烛图(股票K线图)、曲线图、饼图和主线图。这款工具的主要特点在于它能够利用XML数据进行驱动,使得...
在.NET开发环境中,Fusion Charts是一款强大的数据可视化工具,它使用Flash技术呈现各种交互式的图表。对于ASP.NET 2.0开发者来说,尤其在使用C#编程时,能够有效地集成Fusion Charts能显著提升应用程序的用户体验。...
### 使用C#与Excel开发报表并生成统计图表详解 #### 一、背景介绍 随着企业信息化建设的深入发展,报表工具已经成为企业管理者分析业务数据、制定决策的重要手段之一。利用编程语言结合现有的办公软件(如Microsoft...
在Qt4.8.6下,学习使用QtCharts进行绘图的实例教程资源,抛砖引玉仅供参考。作者在Visual Studio210开发工具编写的实例,有二进制编译程序,也有提供了完整的实例源码,同时也有QtCharts在4.8.6下的32位开发库
JSCharts是一款用于在Web页面上动态生成图表的JavaScript库,尤其适用于那些希望在不依赖服务器端处理的情况下,为用户呈现数据可视化的应用。这个库以其强大的功能和易用性著称,可以创建各种类型的图表,如柱状图...
在Java开发领域,报表生成是一个重要的组成部分,尤其对于数据分析、业务监控和数据可视化来说。以下是一些基于Java的报表生成工具的详细介绍: 1. **OpenReports**:OpenReports是一款基于Web的报表生成工具,它...
**JSCharts:轻量级图形报表插件** ...综上所述,JSCharts凭借其易用性、灵活性和强大的功能,成为Web开发中制作图形报表的理想选择。无论是初学者还是经验丰富的开发者,都能借助JSCharts轻松实现数据的可视化呈现。