php程序员,习惯地想到了用jpgraph 来做报表。
但是,jpgraph 乱码的问题我就没办法完全搞定,文件编码用utf-8
首先,在 jpgraph_ttf.inc.php
看到三个中文字体的定义,然后创建图片的时候,设置标题使用的中文字体
运行的时候发现报错:找不到字体bkai00mp.ttf
继续到 jpgraph_ttf.inc.php 找 bkai00mp.ttf
将bkai00mp.ttf改成simsun.ttc宋体,bkai00mp.ttf是什么字体我就不知道了
然后图片中文显示正常了
可是,后面的问题由来了。
创建线条,无论怎么设置字体,依然是中文乱码
不知道怎么回事,不深入研究了,找找别的办法
q群交流,tony推荐用Highcharts,百度百科的介绍:Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。目前HighCharts支持的图表类型有曲线图、区域图、柱状图、饼状图、散状点图和综合图表。
下载一看,果然是好东西,做报表统计、曲线图之类的功能完美、强大
最终效果图:
yii,c中的代码:
//x 轴 $day_30 = strtotime(date('Y-m-d',strtotime('-29 day'))); //最近三十天的时间戳 $day_arr = array(); //最近30天日期数组 $tmp_day_30 = $day_30; for($i=1;$i<=30;$i++){ if($i==1){ $day_arr[] = date('m-d',$tmp_day_30); }else{ $tmp_day_30 = $tmp_day_30+24*3600; $day_arr[] = date('m-d',$tmp_day_30); } } // end x 轴 // y 轴 $db = Yii::app()->db; //所有的订单 $sql = "select date_format(FROM_UNIXTIME(created),'%m-%d') as created,count(goods_name) as c from tb_order_info where created>='$day_30' group by date_format(FROM_UNIXTIME(created),'%m-%d')"; $order = $db->createCommand($sql)->queryAll(); $order_arr = $this->_createY($day_arr,$order); //各个产品的 $every_arr = array(); $allGoods = Goods::model()->findAll(); foreach($allGoods as $v){ $sql_1 = "select date_format(FROM_UNIXTIME(created),'%m-%d') as created,count(goods_name) as c from tb_order_info where created>='$day_30' and goods_id='{$v->id}' group by date_format(FROM_UNIXTIME(created),'%m-%d')"; $every_arr[$v->id] = $this->_createY($day_arr,$db->createCommand($sql_1)->queryAll()); } //end Y 轴 $this->render('chart',array( 'order_list'=>json_encode($order_arr), 'day_list'=>json_encode($day_arr), 'every_arr'=>$every_arr, 'allGoods'=>$allGoods, ));
sql查询的时候,遇到不少麻烦,统计查询的sql忘记的差不多了,复习了半天
created
是时间戳,group by 分类统计的时候,要先将时间戳转换成想要的时间格式: date_format(FROM_UNIXTIME(created),'%m-%d')将查询到的订单数组,组合:
/** * 生成Y轴 * @param array $day_arr X 轴 日期 * @param array $order 订单 * @return array */ private function _createY($day_arr, $order){ $order_arr = array(); foreach($day_arr as $v){ $order_arr[$v] = 0; foreach($order as $v2){ if($v==$v2['created']){ $order_arr[$v] = intval($v2['c']); } } } return array_values($order_arr); }
按照时间的顺序,排好三十天内每天的下单数量
view的代码:
<?php/* @var $this OrderInfoController *//* @var $day_list x轴时间 *//* @var $order_list Y轴数量 *//* @var $every_arr 各个产品的Y轴数量 *//* @var $allGoods 所有产品 */Yii::app()->clientScript->registerCoreScript('jquery');Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/highcharts/highcharts.js');Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/highcharts/modules/exporting.js');?><script type="text/javascript"> $(function () { $('#order').highcharts({ chart: { type: 'line', marginRight: 130, marginBottom: 50 }, title: { text: '最近30天下单统计', x: -20 //center }, subtitle: { text: '', x: -20 }, xAxis: { categories: <?=$day_list?> }, yAxis: { title: { text: '数量' }, plotLines: [{ value: 0, width: 1, color: '#808080' }] }, tooltip: { valueSuffix: '个' }, legend: { layout: 'vertical', align: 'right', verticalAlign: 'top', x: -10, y: 100, borderWidth: 0 }, series: [ { name: '所有产品', data: <?=$order_list?> }, <?php foreach($allGoods as $v): ?> { name: '<?=$v->title?>', data: <?=json_encode($every_arr[$v->id])?> }, <?php endforeach; ?> ] }); });</script><div id="order"></div>
posted on 2013-05-24 10:40 阅读( ...) 评论( ...)