anychart java实例_结合AnyChart做报表:一个生成AnyChart图形XML数据的工具类
今天头有点痛,所以不能详细地写了,先把代码贴上来,等身体状况稍微好一点,再继续完善。
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数据的工具类相关推荐
- anychart java实例_在.Net开发中使用AnyChart的简单例子(上)
1.AnyChart控件相关 显示效果 2.AnyChart的简单原理 AnyChart是一个Flash做的控件,原理图在安装了AnyChart后的说明文档里面有,这里贴一下 其实很好理解,就是想办法 ...
- 黑白块游戏java代码_用java做的一个小游戏—黑白反斗棋(适合菜鸟)
用Java做的一个小游戏,黑白反斗棋,我玩过了5*5和10*10的.是学习之后做的,不是自己原始开发的. import java.awt.Color; import java.awt.FlowLayo ...
- 好用的对象转xml、xml转对象工具类-支持集合嵌套转换(Java实现)
好用的对象转xml.xml转对象工具类-支持集合嵌套转换(Java实现) 网上找了很多转换工具,对于自己的业务都不是很合适,所以总结了一下网上的方案,最终定下来是这样子的,主要使用dom4j做操作 m ...
- java外部接口图解_java代码实现访问网络外部接口并获取数据的工具类详解
java代码实现访问网络外部接口并获取数据的工具类 工具类代码,可以直接copy使用 package com.yqzj.util; import org.apache.log4j.LogManager ...
- 做了一个阿里云MQTT单片机编程小工具
做了一个阿里云MQTT单片机编程小工具,点击测试http://www.norra.cn:9091/ 传感云是采集.传输.存储.可视化.接口.APP.微信一体的传感器与应用服务平台,支持多种模式 ...
- Java生成和解析二维码工具类(简单经典)
Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...
- 聚合数据-万年历工具类-Java
聚合数据-万年历工具类 简述 聚合数据万年历接口 Maven jar包支持 工具类能力列表 1. 查询近期假期 2. 查询某天详细信息 3. 判断某天是否是假期或休息日 整体代码类 尾语 简述 此工具 ...
- java 自定义报表_设计好的报表是如何在 web 上显示的
润乾报表主要用来开发在 java web 端呈现的报表工具,设计器为桌面版,那么开发后的报表如何发布到 web 端是用户较为关心的问题. 润乾报表 web 端发布,采用 Taglib 方式,只需要在 ...
- java实例_图例 | Java混合模式分析之火焰图实例
这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...
最新文章
- 复习06统计学习方法(Logistic回归与最大熵模型)---图片版
- 什么是智能仓储?一文带你彻底搞懂!
- MCMC(二)马尔科夫链
- SQL注入学习——sqli-labs闯关(Basic Challenges)
- Java中使用log4j记录日志
- Java设计模式笔记(5)建造者模式
- MTK 驱动(73)--- Kernel Backtrace 无法显示出具体的地址.
- 菜鸟python 正则表达式_python基础知识(进阶篇--正则表达式)
- 利用Aspose.PDF for .NET实现pdf转word
- word中将英文及数字全部修改为Times New Roman字体
- 傅里叶变换后面的到底有什么小秘密?
- 串口服务器与协议转换器的区别,串口服务器和串口转以太网模块区别
- python做估值模型_通证估值模型-费雪模型与净现值模型详解
- Swagger报错:missed comma between flow collection entries
- 哎,为了在vs上开发或调试linux,各种跪啊。而且后面还有更多……
- 自动化成本高?那么如何获得最高的投资回报呢?
- Windows电脑怎么格式化?
- mac php怎么做网页,Mac_mac系统中safari怎么添加书签? 把常用网页添加到收藏夹的效果,苹果电脑mac系统自带safari浏览 - phpStudy...
- 十大黑客电影-关于程序员或者关于电脑高手的电影
- java实现九宫格解锁_Java计算手机九宫格锁屏图案连接9个点的方案总数
热门文章
- 借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流
- 应对公共部门银行的不良资产问题
- 安装Windows、kylin麒麟双系统
- Fillchar过程全解
- 【附源码】Java计算机毕业设计科院垃圾分类系统(程序+LW+部署)
- Htb socket wp
- 判断两个线段相交问题(快速排斥实验跨立实验)
- python3官方文档下载_Python3.2.3官方文档
- egret微信小游戏相关
- 旷视科技为何战略投资Video++?版图扩展打造AI+IoT 闭环 | 专访唐文斌