今天头有点痛,所以不能详细地写了,先把代码贴上来,等身体状况稍微好一点,再继续完善。

1、(主角)一个使用XML模板生成Anychart XML数据的工具类

/**

*

*/

package com.common.anychart;

import java.io.InputStream;

import java.util.List;

import org.apache.commons.collections.CollectionUtils;

import org.apache.commons.lang.NullArgumentException;

import org.apache.commons.lang.StringUtils;

import org.apache.log4j.Logger;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import com.common.reflect.ReflectUtils;

/**

* XML数据处理工具类,服务于AnyChart报表

* @author luolin

*

* @version $id:AnyChartXMLProcessor.java,v 0.1 2015年8月19日 上午10:15:57 luolin Exp $

*/

public class AnyChartXMLProcessor {

private static final Logger LOGGER = Logger

.getLogger(AnyChartXMLProcessor.class);

/** 简单线性曲线图模板路径 */

private static final String SIMPLE_LINE_TEMPLATE_FILE = "xmltemplate/simpleLine.xml";

/** 简单柱状图图模板路径 */

private static final String SIMPLE_HISTOGRAM_TEMPLATE_FILE = "xmltemplate/simpleHistogram.xml";

/**

* 使用simpleLine.xml模板生成简单的线性曲线图XML数据

* @param xName x轴标题,格式如:“X轴标题@feild”,feild表示从数据中取值的字段

* @param yName y轴标题,格式如:“y轴标题@feild”,feild表示从数据中取值的字段

* @param title 图标标题

* @param dataList 要展示的数据

* @return 生成的XML数据

* @throws Exception

*/

public static String simpleLine(String xName, String yName, String title, List> dataList)

throws Exception {

LOGGER.info("【使用categorizedVertical.xml模板生成简单的线性曲线图XML数据】xName : " + xName + " , yName : "

+ yName + " , title : " + title);

// 基本参数校验

if (!baseDataValidate(xName, yName, title, dataList)) {

return "";

}

String[] xData = xName.split("@");

String[] yData = yName.split("@");

// 坐标轴数据校验

axisFormatValidate(xData, yData);

InputStream inputStream = AnyChartXMLProcessor.class.getClassLoader().getResourceAsStream(

SIMPLE_LINE_TEMPLATE_FILE);

return templateProcessor(title, dataList, xData, yData, inputStream);

}

/**

* 根据模板处理数据,生成修改后的XML数据

* @param title 统计图的标题

* @param dataList 统计数据

* @param xData X轴数据

* @param yData Y轴数据

* @param inputStream 读入模板的流

* @return 修改模板后得到的XML数据

* @throws Exception

*/

@SuppressWarnings("unchecked")

private static String templateProcessor(String title, List> dataList, String[] xData,

String[] yData, InputStream inputStream)

throws Exception {

SAXReader sax = new SAXReader();

Document xmlDoc = sax.read(inputStream);

Element root = xmlDoc.getRootElement();//根节点

// 取得text节点

List titleElements = root.selectNodes("//text");

// 得到chart_settings下的第一个text节点,并修改它的值

Element titleElement = titleElements.get(0);

titleElement.setText(title);

// 得到X轴的第一个text坐标,修改它的值

Element xTitleElement = titleElements.get(1);

xTitleElement.setText(xData[0]);

// 得到X轴的第一个text坐标,修改它的值

Element yTitleElement = titleElements.get(2);

String yTitleTemplate = yTitleElement.getTextTrim();

yTitleElement.setText(yTitleTemplate.replace("#YTitle#", yData[0]));

// 替换format里面的x、y的标题

List formatElements = root.selectNodes("//format");

if (CollectionUtils.isNotEmpty(formatElements)) {

for (Element element : formatElements) {

String formatText = element.getTextTrim();

element.setText(formatText.replace("#YTitle#", yData[0]).replace("#XTitle#",

xData[0]));

}

}

Element dataElement = (Element) root.selectSingleNode("//data");

// 如何数据集里存放的是更多数据集(表示需要多条线或者多柱),循环处理

if (dataList.get(0) instanceof List) {

for (Object element : dataList) {

createSeriesElement(title, (List>) element, xData, yData, dataElement);

}

return xmlDoc.asXML();

}

createSeriesElement(title, dataList, xData, yData, dataElement);

return xmlDoc.asXML();

}

/**

* 生成series部分

* @param title 标题

* @param dataList 数据集合

* @param xData X轴数据

* @param yData Y轴数据

* @param dataElement "data"节点

* @throws Exception

*/

private static void createSeriesElement(String title, List> dataList, String[] xData,

String[] yData, Element dataElement) throws Exception {

Element seriesElement = dataElement.addElement("series");

seriesElement.addAttribute("name", title);

for (Object item : dataList) {

Element pointElement = seriesElement.addElement("point");

pointElement.addAttribute("name",

String.valueOf(ReflectUtils.getCellValue(item, xData[1])));

pointElement.addAttribute("y",

String.valueOf(ReflectUtils.getCellValue(item, yData[1])));

}

}

/**

* 坐标轴数据校验

* @param xData X轴信息

* @param yData Y轴信息

*/

private static void axisFormatValidate(String[] xData, String[] yData) {

if (xData.length < 2) {

LOGGER.warn("【xName参数不正确】xData : " + xData);

throw new IllegalArgumentException("xName");

}

if (yData.length < 2) {

LOGGER.warn("【yName参数不正确】yData : " + yData);

throw new IllegalArgumentException("yName");

}

}

/**

* 基本数据校验

* @param xName x轴标题,格式如:“X轴标题@feild”,feild表示从数据中取值的字段

* @param yName y轴标题,格式如:“y轴标题@feild”,feild表示从数据中取值的字段

* @param title 图标标题

* @param dataList 要展示的数据

*/

private static boolean baseDataValidate(String xName, String yName, String title,

List> dataList) {

if (CollectionUtils.isEmpty(dataList)) {

LOGGER.warn("【数据dataList为空】");

return false;

}

if (StringUtils.isBlank(xName)) {

LOGGER.warn("【xName为空】");

throw new NullArgumentException("xName");

}

if (StringUtils.isBlank(yName)) {

LOGGER.warn("【yName为空】");

throw new NullArgumentException("yName");

}

if (StringUtils.isBlank(title)) {

LOGGER.warn("【title为空】");

throw new NullArgumentException("title");

}

return true;

}

/**

* 使用simpleHistogram.xml模板生成简单的柱状图的XML数据

* @param xName x轴标题,格式如:“X轴标题@feild”,feild表示从数据中取值的字段

* @param yName y轴标题,格式如:“y轴标题@feild”,feild表示从数据中取值的字段

* @param title 图标标题

* @param dataList 要展示的数据

* @return 生成的XML数据

* @throws Exception

*/

public static String simpleHistogram(String xName, String yName, String title, List> dataList)

throws Exception {

LOGGER.info("【使用simpleHistogram.xml模板生成简单的柱状图的XML数据】xName : " + xName + " , yName : "

+ yName + " , title : " + title);

// 基本参数校验

if (!baseDataValidate(xName, yName, title, dataList)) {

return "";

}

String[] xData = xName.split("@");

String[] yData = yName.split("@");

// 坐标轴数据校验

axisFormatValidate(xData, yData);

InputStream inputStream = AnyChartXMLProcessor.class.getClassLoader().getResourceAsStream(

SIMPLE_HISTOGRAM_TEMPLATE_FILE);

return templateProcessor(title, dataList, xData, yData, inputStream);

}

/**

* 使用simpleHistogram.xml模板生成简单的多柱柱状图的XML数据

* @param xName x轴标题,格式如:“X轴标题@feild”,feild表示从数据中取值的字段

* @param yName y轴标题,格式如:“y轴标题@feild”,feild表示从数据中取值的字段

* @param title 图标标题

* @param dataList 要展示的数据

* @return 生成的XML数据

* @throws Exception

*/

public static String compareHistogram(String xName, String yName, String title,

List> dataList) throws Exception {

LOGGER.info("【使用simpleHistogram.xml模板生成简单的多柱柱状图的XML数据】xName : " + xName + " , yName : "

+ yName + " , title : " + title);

// 基本参数校验

if (!baseDataValidate(xName, yName, title, dataList)) {

return "";

}

String[] xData = xName.split("@");

String[] yData = yName.split("@");

// 坐标轴数据校验

axisFormatValidate(xData, yData);

InputStream inputStream = AnyChartXMLProcessor.class.getClassLoader().getResourceAsStream(

SIMPLE_HISTOGRAM_TEMPLATE_FILE);

return templateProcessor(title, dataList, xData, yData, inputStream);

}

}

2015-8-27 09:26:11更新:昨天忘记添加其中用到的一个反射工具类的代码,今天补上:

ReflectUtils.java

/**

*

*/

package com.common.reflect;

import java.lang.reflect.Field;

/**

* 反射工具类

* @author luolin

*

* @version $id:ReflectUtils.java,v 0.1 2015年8月19日 下午1:46:54 luolin Exp $

*/

public class ReflectUtils {

/**

* 通过字段名从对象中得到字段的值

* @param object 对象

* @param fieldName 字段名

* @return 字段对应的值

* @throws Exception

*/

public static Object getCellValue(Object object, String fieldName) throws Exception {

Field[] fields = object.getClass().getDeclaredFields();

Object value = null;

for (Field field : fields) {

field.setAccessible(true);

if (field.getName().equals(fieldName)) {

value = field.get(object);

break;

}

}

return value;

}

}

2、模板文件:目前我使用了两个简单的模板文件。朋友们在使用的时候,注意模板相对工程的路径需要根据实际情况修改。

折线图模板(simpleLine.xml):

标题未初始化

#XTitle#

#YTitle#: {%Min} - {%Max}

{%YValue}{numDecimals:0}

#YTitle#: {%YValue}{numDecimals:2}

#XTitle#: {%Name}

柱状图模板(simpleHistogram.xml):

标题未初始化

#XTitle#

#YTitle#: {%Min} - {%Max}

#YTitle#: {%YValue}{numDecimals:2}

#XTitle#: {%Name}

3、如何使用?

我是使用AJAX的方式获取XML数据并交给anychart的。

/**

* 创建图表

* @param chartDivId 显示图表的DIV的ID

* @param xmlData 图表需要的XML数据

*/

function createChart(chartDivId,xmlData){

AnyChart.swfFile = "../js/anychart/AnyChart.swf";

AnyChart.initText = "初始化中,请稍后...";

AnyChart.xmlLoadingText = "数据加载中,请稍后...";

AnyChart.noDataText = "没有数据显示,换个查询条件试试!";

var g_dxzr_chart = new AnyChart();

g_dxzr_chart.width = '100%';

g_dxzr_chart.height = '100%';

g_dxzr_chart.bgColor = "#ffffff";

g_dxzr_chart.setData(xmlData);

g_dxzr_chart.write(chartDivId);

}

/**

* 获取数据

* @param top3FormId 查询参数的form的ID

*/

function executeAnalyzeTop3(top3FormId,chartDivId){

var $form = $('#'+top3FormId);

$.ajax({

url:$form.attr('action'),

data:$form.serialize(),

dataType:'text',

type:'post',

success:function(data){

// 创建图表

createChart(chartDivId,data);

},

error:function(){

alert('系统异常,请联系管理员!');

}

})

}

大家如果有什么问题的话,可以给我留言,我也是最近才接触到anychart的,效果其实觉得还不错。

大家一起学习进步。

anychart java实例_结合AnyChart做报表:一个生成AnyChart图形XML数据的工具类相关推荐

  1. anychart java实例_在.Net开发中使用AnyChart的简单例子(上)

    1.AnyChart控件相关 显示效果 2.AnyChart的简单原理 AnyChart是一个Flash做的控件,原理图在安装了AnyChart后的说明文档里面有,这里贴一下 其实很好理解,就是想办法 ...

  2. 黑白块游戏java代码_用java做的一个小游戏—黑白反斗棋(适合菜鸟)

    用Java做的一个小游戏,黑白反斗棋,我玩过了5*5和10*10的.是学习之后做的,不是自己原始开发的. import java.awt.Color; import java.awt.FlowLayo ...

  3. 好用的对象转xml、xml转对象工具类-支持集合嵌套转换(Java实现)

    好用的对象转xml.xml转对象工具类-支持集合嵌套转换(Java实现) 网上找了很多转换工具,对于自己的业务都不是很合适,所以总结了一下网上的方案,最终定下来是这样子的,主要使用dom4j做操作 m ...

  4. java外部接口图解_java代码实现访问网络外部接口并获取数据的工具类详解

    java代码实现访问网络外部接口并获取数据的工具类 工具类代码,可以直接copy使用 package com.yqzj.util; import org.apache.log4j.LogManager ...

  5. 做了一个阿里云MQTT单片机编程小工具

      做了一个阿里云MQTT单片机编程小工具,点击测试http://www.norra.cn:9091/   传感云是采集.传输.存储.可视化.接口.APP.微信一体的传感器与应用服务平台,支持多种模式 ...

  6. Java生成和解析二维码工具类(简单经典)

    Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  7. 聚合数据-万年历工具类-Java

    聚合数据-万年历工具类 简述 聚合数据万年历接口 Maven jar包支持 工具类能力列表 1. 查询近期假期 2. 查询某天详细信息 3. 判断某天是否是假期或休息日 整体代码类 尾语 简述 此工具 ...

  8. java 自定义报表_设计好的报表是如何在 web 上显示的

    润乾报表主要用来开发在 java web 端呈现的报表工具,设计器为桌面版,那么开发后的报表如何发布到 web 端是用户较为关心的问题. 润乾报表 web 端发布,采用 Taglib 方式,只需要在 ...

  9. java实例_图例 | Java混合模式分析之火焰图实例

    这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...

最新文章

  1. 复习06统计学习方法(Logistic回归与最大熵模型)---图片版
  2. 什么是智能仓储?一文带你彻底搞懂!
  3. MCMC(二)马尔科夫链
  4. SQL注入学习——sqli-labs闯关(Basic Challenges)
  5. Java中使用log4j记录日志
  6. Java设计模式笔记(5)建造者模式
  7. MTK 驱动(73)--- Kernel Backtrace 无法显示出具体的地址.
  8. 菜鸟python 正则表达式_python基础知识(进阶篇--正则表达式)
  9. 利用Aspose.PDF for .NET实现pdf转word
  10. word中将英文及数字全部修改为Times New Roman字体
  11. 傅里叶变换后面的到底有什么小秘密?
  12. 串口服务器与协议转换器的区别,串口服务器和串口转以太网模块区别
  13. python做估值模型_通证估值模型-费雪模型与净现值模型详解
  14. Swagger报错:missed comma between flow collection entries
  15. 哎,为了在vs上开发或调试linux,各种跪啊。而且后面还有更多……
  16. 自动化成本高?那么如何获得最高的投资回报呢?
  17. Windows电脑怎么格式化?
  18. mac php怎么做网页,Mac_mac系统中safari怎么添加书签? 把常用网页添加到收藏夹的效果,苹果电脑mac系统自带safari浏览 - phpStudy...
  19. 十大黑客电影-关于程序员或者关于电脑高手的电影
  20. java实现九宫格解锁_Java计算手机九宫格锁屏图案连接9个点的方案总数

热门文章

  1. 借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流
  2. 应对公共部门银行的不良资产问题
  3. 安装Windows、kylin麒麟双系统
  4. Fillchar过程全解
  5. 【附源码】Java计算机毕业设计科院垃圾分类系统(程序+LW+部署)
  6. Htb socket wp
  7. 判断两个线段相交问题(快速排斥实验跨立实验)
  8. python3官方文档下载_Python3.2.3官方文档
  9. egret微信小游戏相关
  10. 旷视科技为何战略投资Video++?版图扩展打造AI+IoT 闭环 | 专访唐文斌