css统计图-使用Ext创建多柱图和折线图(动态加载数据)

2023-09-02 0 2,631 百度已收录

最近的一个项目需要使用统计图表。 我对 FreeChart 了解一点有关统计图表的知识,但对 Ext 则一无所知。 只有边做边学,边做边学。

先看效果图:

这是按客户类型查询的协议金额的统计图,比较简单。 只有两种类型,只有三列(这个不重要)

需要用到的主要Java代码:

css统计图-使用Ext创建多柱图和折线图(动态加载数据)

动作代码(SQL语句可以随意写):

SView view= (SView) dao.get(SView.class, new Integer(viewID));
if(view==null)throw new Exception(" can not find view entity by viewid, if viewid="+viewID);
String sql=view.getSelectcondition();
String datas=dao.findBySQL(sql);
req.setAttribute("datas",datas);
req.getRequestDispatcher(path).forward(req, res);

DAO 代码:

/**
* 获取 
* @param cls
* @param id
* @return
*/
public Object get(Class cls,Serializable id){
 try {
	return getHibernateTemplate().get(cls,id);
     } catch (RuntimeException re) {
	throw re;
     }
}
/***
* 根据原生 SQL查询
 * @param sql
 * @return
*/
public String  findBySQL(final String sql) {
	try {
		String restr="[";
		List result = (List ) getHibernateTemplate().execute(new HibernateCallback() {
			public Object doInHibernate(Session arg0) throws HibernateException,SQLException {
					return arg0.createSQLQuery(sql).list();
				}
			});
		for (int i = 0; i < result.size(); i++) {
			Object [] objs=  result.get(i);
			if(i!=0)restr+=",";
			restr+="{";
			for (int j = 0; j < objs.length; j++) {
				if(j!=0)restr+=",";
				//restr+="'field"+j+"":""+objs[j]+""";
				if(NumberUtils.isNumber(objs[j].toString())){
					restr+="'field"+j+"':"+objs[j]+"";
				}else{
					restr+="'field"+j+"':'"+objs[j]+"'";
				}
			}
			restr+="}";
		}
		restr+="]";
		return restr;
	} catch (RuntimeException re) {
		    throw re;
	}
}

页面主要JS代码:

css统计图-使用Ext创建多柱图和折线图(动态加载数据)

1.需要导入的JS和CSS文件:

<script type="text/javascript" src="/js/jquery-1.4.2.js">
<link rel="stylesheet" href="/EChart/lib/style.css" type="text/css">
<link rel="stylesheet" href="/EChart/extlib/resources/css/ext-all.css" type="text/css">
<script type="text/javascript" src="/EChart/extlib/ext-all.js">

2.Ext JS(具体配置见官网):

Ext.require('Ext.chart.*');
Ext.require([ 'Ext.layout.container.Fit', 'Ext.data.JsonStore' ]);
Ext.onReady(function() {
var store1= Ext.create('Ext.data.JsonStore', {
           fields: ['field0', 'field1', 'field2', 'field3','field4'],//自选需要几个就写几个
           data: ${datas}
//其中,data的JSON串是这个样子的:
//[{'field0':'国企','field1':3,'field2':1000500.0,'field3':220000.0,'field4':780000.0},{'field0':'私企','field1':1,'field2':100000.0,'field3':5000.0,'field4':95000.0}]
       });
	Ext.create('Ext.chart.Chart', {
	   renderTo: "main1",//显示的位置,我这里放在了ID为“main1”的DIV里,默认的是在body里面(Ext.getBody())
	   width: '95%',
           height: 600,
           minHeight: 400,
           minWidth: 550,
           hidden: false,
           maximizable: true,
           title: '${view.viewname}',
           autoShow: true,
           layout: 'fit',
	   style: 'background:#fff',
           animate: true,        //动画
           shadow: true,         //阴影
           store: store1,        //##
           legend: {            //图例:默认为false,不显示
             position: 'right'   //显示位置有四个:top、bottom、left、right
           },
           axes: [
		//左边纵坐标配置
		{
		 type: 'Numeric',  //显示图形类型
		 position: 'left', //显示位置
		fields: ['field2', 'field3','field4'],
		minimum: 0,  //如果小于这个数,图标向下(相当于设置了一个起始点)
		label: {
			renderer: Ext.util.Format.numberRenderer('0,0')
		 },
		grid: true,
		title: '${view.viewcomment}'//左边纵坐标的标题
		},
		//右边纵坐标配置
		{
               type: 'Numeric',  //显示图形类型
               position: 'right',//显示位置
               fields: ['field1'],
               minimum: 0,  //如果小于这个数,图标向下(相当于设置了一个起始点)
               label: {
                   renderer: Ext.util.Format.numberRenderer('0,0')
               },
               grid: true,
               title: '合同数量'//右边纵坐标的标题
               
           }, 
           //横坐标配置
           {
               type: 'Category',
               position: 'bottom',//显示位置
               fields: ['field0'], 
               title: '${view.viewdescript}'
              
           }],
           series: [
               {
               type: 'column',//统计图类型:柱状图
               axis: 'left',
				highlight : true,//高亮显示(鼠标移动到上面时,高亮显示)
				label : {//显示柱上面的数字,并设置样式
					display : 'insideEnd','text-anchor' : 'middle',	
					field : ['field2', 'field3','field4'],//柱上显示的数字,一一对应
					renderer : Ext.util.Format.numberRenderer('0'),
					orientation : 'vertical',
					color : '#333'
				},
				listeners : {//监听,点击时触发的事件
					"itemclick" : function(storeItem) {//点击时alert出横坐标的值(或者跳转到指定的页面)
						alert(storeItem.storeItem.get('field0'));
					}
				},
               xField: 'field0',
               yField: ['field2', 'field3','field4'],
               title:['合同金额','已收金额','未收金额']//自定义的图例名称
               },
               {
                   type: 'line',//折线
                   axis: 'right',
    				highlight : true,
    				label : {//显示柱上面的数字,并设置样式
    					display : 'insideEnd','text-anchor' : 'middle',	
    					field : ['field1'],
    					renderer : Ext.util.Format.numberRenderer('0'),
    					orientation : 'vertical',
    					color : '#333'
    				},
    				listeners : {//点击时alert出横坐标的值(或者跳转到指定的页面)
						"itemclick" : function(storeItem) {
							alert(storeItem.storeItem.get('field0'));
						}
					}, markerConfig: {
    		                type: 'circle',//折线图“点”的样式
    		                size: 4,
    		                radius: 4,
    		                'stroke-width': 0
    		            },
                   xField: 'field0',
                   yField: ['field1'],
                   title:'合同数量'//自定义的图例名称
                   }
               
           ]
       });
});

效果已经下来了,需要说明的点是我在做这个过程中遇到的几个令人头疼的问题:

css统计图-使用Ext创建多柱图和折线图(动态加载数据)

1、如果不显示直方图,则显示折线图;

2、折线图中有一个点在横坐标下方(类似正数的情况);

网上搜了一下这些情况,得到的答案是:值为null,则不会显示,折线图如果缺失则按0处理。 但显然,我不是这两种情况(我警报了传递的json字符串并且有数据)。 如果数据没有问题,那么可能是结构或类型问题。 我检查了结构,这是一个正常的 JSON 结构,是的。 检查类型。 既然不知道是哪些类型,那就去官网找例子看看类型。 都是用静态数据演示,数据类型一目了然:数值型(都是数字,统计图表肯定是数字,不然就失去了统计意义,只是为了得到几个数字) 。 回去查看一下我的JSON字符串([{'field0":"国有企业",'field1":"3",'field2":"1000500.0",'field3":"220000.0",'field4":" 780000.0"} ,{'field0":"私营企业",'field1":"1",'field2":"100000.0",'field3":"5000.0",'field4":"95000.0"}]), 全部由双引号引起来的,无论是数字还是名字。 于是我改了一下,去掉了数字的双引号(即代码中的数字判断:NumberUtils.isNumber(objs[j].toString()),我知道这个方法已经过时了),并进行了测试问题仍然存在。 我粘贴了官网的静态数据,没问题。 那我一定是漏掉了数据中的一些东西,然后我又发现别人的名字用的是单冒号,而我也用的是双冒号。 我将其更改为单个冒号,并再次测试。

所以,总结一下:Ext数据库中拼接JSON字符串时,数字不要使用冒号(奇数、偶数都不要使用),非数字使用单冒号。 不管能不能治病,都治不了死人。

3、折线图第一个点为0,第二个点为正常(为1);

css统计图-使用Ext创建多柱图和折线图(动态加载数据)

4、总有一个点在0(即折线图是从0开始的,即使我的点的数据小于0);

上述问题已经解决。 显示统计图表,不再出现在横坐标下方。 但是第一个点始终是0,但是它的数据明明是3。我把数据库机房改成了官网测试数据。 哎,它居然还有从0开始的一列,我改了其他数据,发现“真卿”这一列不是0,但是总有一列是0。,奇怪了。 于是我查了又查,发现折线图的轴位置是:'bottom',横坐标也是bottom。 按道理来说,我应该让它按照左边的坐标来显示css统计图,而不是像横坐标那样。 所以我改成了right,即:position: 'right'。 刷新后就正常了。 替换为官网静态数据。 不管怎么改,都不再从0开始了(测试数据都是小于0的数据)。

小结:设置折线图纵坐标位置时,一定不要设置为底部,否则会从底部位置开始。

5.图例问题

效果图:

我的 yFields 都是 field1、field2、field3 和 field4。 图例就是按照这个取的,自然是field1/2/3。 如果不显示图例,谁知道图表上的三个条和两个点代表什么。 显示出来,不仅是写这些field1、field2、field3的人,连其他人也不知道他们是谁。 于是就想着改ext的JScss统计图,怎么改,不知道,搜索一下。 我发现了一篇类似的文章,也改了图例(链接:),但是是英文写的,看不懂。 我用谷歌翻译。 不知道微软是不是要加入台湾什么的,就是打不开。 我终于打开了一次,但由于某种原因我的 Maxthon 死机了。 当我再次打开它时,我无法连接到它。 不可能。 我只能认真看看。 我差不多猜到了,我也有意见了。 我打算更改 ext.all.js。 当我打开它时,我的IDE直接挂了。 检查属性,发现有2M多了,太大了,而且所有代码还是写在一行里。 你必须先投反对票。 网上找了一个JS低格式化工具,格式化了一下。 结构看起来很不错,所以我想我可以做到。 然而统计图一运行就报错,统计图根本打不开。 不低还不够吗? 我又改回来,又看到了统计图。 这么长的一行代码(格式化后超过9万行)要找到我想要的图例并不容易。 我一打开IDE就不得不挂掉它。 最后我打不开了,就复制粘贴了。 这东西,IDE也得摆。 即使更换了显存后,问题依然存在,并且我尝试了几次的代码都丢失了。 我的配置不低,是I5,虚拟内存设置为1024,还不错。 嘿,如果有一个单独的 ext 图表的 js 包就好了,至少肯定不会那么大(也许它已经存在,但我还不知道)。

更改ext的JS失败,于是我又想到了一个技巧:直接用汉字替换field1、field2、field3。 显示时,用汉字进行检查。 我们去总部吧。 尝试了一下果然有效,和我刚才的效果是一样的。

虽然效果有所改善,但我还是觉得不是很好。 然后我就上网搜索,这次搜索的是:extjs4.0图表图例(之前搜索的都是英文,这次我也尝试一下中文),找到了一个。 本文与它()无关,主要讲Ext的使用。 读完之后,基本看懂了,但是很无聊。 刚刚看了下面的评论,看到有人问我这个问题(看来这个问题困惑的不止我一个,哈哈),我看到了回复,哈哈,有结果了:在前面加个标题yField,如上面代码:title:['合同金额','已收到金额','未收到金额'],如果只写一个标题:['合同金额'],那么三列的图例名称都是‘合同金额’(不信你可以试试),(上面有回复就是这个链接:我点进去看了一下。直到最后一行才找到我要找的东西) 。

这个Ext确实不简单,或者是我太笨了! 嘿,慢慢来!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 css css统计图-使用Ext创建多柱图和折线图(动态加载数据) https://www.wkzy.net/game/190085.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务