FusionCharts Free 使用方法

FusionCharts Free 使用方法

FusionCharts Free目前最新的版本3.0 官方下载下来的文件 虽然不收费,但是每次图表上都有个讨厌的连接,所以可爱的破解帝 早早地放出了破解版本,至于在哪能找到, 大家就Google去吧..里面我们要用到的文件上篇已经介绍了,就是几个.swf 文件和一个js.

上篇介绍了fcf 最基本的创建方式,就是一段简单的js 脚本,和一个xml数据文件.当然你也可以不写那段js脚本,

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
	codebase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="600" height="500" id="Column3D" > 
	<param name="movie" value="/FusionCharts/Column3D.swf" /> 
	<param name="FlashVars" value="&dataURL=Data.xml&chartWidth=600&chartHeight=500"> 
	<param name="quality" value="high" /> 
	<embed src="../FusionCharts/FCF_Column3D.swf" flashVars="&dataURL=Data.xml&chartWidth=600&chartHeight=500" 
		quality="high" width="600" height="500" name="Column3D"type="application/x-shockwave-flash" 
		pluginspage="http://www.macromedia.com/go/getf lashplayer" /> 
</object> 


 

第一处标红的地就是 flash的数据模板,第二处是 加载的xml文件的地址了.

这种方式有个坏处,就是在有的浏览器打开flash时候有提示 点击激活控件,,不知道大家见过没,所以本人推荐用javascript来创建..

上面只是简单的介绍,下面进入正题:

FCF几个常用的属性介绍

FCF的属性N多,这里我只找几个常用的来介绍下

FCF 中是用1和0来表示Bool值的.1表示true,0表示false

<chart caption='主标题' subcaption='副标题' animation='1' formatNumberScale='0' numberSuffix='元' pieSliceDepth='30' rotateValues='1' > 

… 

</chart> 


 

Caption ,subcaption主标题 副标题

Animation:是否启用动画, Bool类型

numberSuffix : Y轴单位后缀 numberPrefix:前缀.

formatNumberScale 是否格式化数字,默认为1(True),自动的给你的数字加上K(千)或M(百万);若取0,则不加K或M

rotateValues : 显示的值的形状, 竖的是1(True)横向显示0。

<categories>

<category label='2004' name='2004'/>

。。。

</categories>

设置X 轴的值

<set name = '2003' value='38000' />

Y轴显示的数据值,这里的值必须和category的个数对应,而且顺序也不能错,否则数据会显示错乱(本人觉得这点fcf做的很不智能,至少应该可以用name对应吧.)

<dataset seriesName='Andrew' >

<set name = '2004' value='36412' />

</dataset>

一个Dataset表示一个项,也就是表示一个图表上的一个数据。

实例Demo

网上的一些Demo生成的数据都是比较有规律的,无非就一个组合图或者单系数据显示,这里就跳过简单的,做一个复杂点的数据生成,因为实际中统计的数据一般都不会那么有规律。

数据库表如下:

clip_image001

现在要统计出每人每年的消费情况..数据是没有规律的,有的人在一些年份上没有数据,

我们利用FCF的js 来创建图表, 无非就是要传递一个xml数据,或者一个xml格式的字符串.这里我采用了后台生成的方法.

public string GetCharts() 

{

StringBuilder sb = new StringBuilder();

sb.Append("<chart caption='主标题' subcaption='副标题' palette='0' animation='1' formatNumberScale='1' numberSuffix='元a' pieSliceDepth='30' rotateValues='1' startingAngle='125'>");

sb.Append(DataGeneration.getAccessData());

sb.Append("</chart>");

return FusionCharts.RenderChart("/Charts/MSColumn3D.swf", "", sb.ToString(), "EmpSalesTotal", "700", "500", false, false);

}

在前台页面直接掉调用这个方法输出就可以了。

DataGeneration.getAccessData()

这个就是生成数据的方法了,

    public static string getAccessData()
        {
            StringBuilder SDataSet = new StringBuilder();
            StringBuilder Scategory = new StringBuilder();
            DataTable table = new DataTable();
            List<AccessDat> list = new List<AccessDat>();
            string sql = "select Names,Years,sum(Sales) as Sales from AccessDat group by Years,Names";
            using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TestDb;User ID=sa;Password=sasasa"))
            {
                conn.Open();
                SqlCommand command = new SqlCommand(sql, conn);
                SqlDataReader reader = command.ExecuteReader();
                AccessDat dat = new AccessDat();
                while (reader.Read())
                {
                    dat = new AccessDat()
                    {
                        Names = reader["Names"].ToString(),
                        Sales = reader["Sales"].ToString(),
                        Years = reader["Years"].ToString()
                    };
                    list.Add(dat);
                }
                reader.Close();
            }
            //Names列表            var nameList = from item in list group item by item.Names;
            //Years列表            var yearList = from item in list orderby item.Years descending group item by item.Years;
            //先创建x轴数据,Years为X轴数据            Scategory.Append("<categories>");
            foreach (var item in yearList)
            {
                Scategory.Append("<category label='" + item.Key + "' name='" +
                        item.Key + "'/>");
            }
            Scategory.Append("</categories>");
            //获取x轴项数            int allCount = yearList.Count();
            foreach (var item in nameList)
            {
                SDataSet.Append("<dataset seriesName='" + item.Key + "' >");
                //根据当前循环到的Names 得到该人每年的Sales,列表                var slaesList = from p in list
                                where p.Names == item.Key
                                orderby p.Years descending
                                group p by p.Years into g
                                select new { g.Key, Sales = g.Select(p => p.Sales).First() };
                //此处注意,为了set的顺序和category顺序对应,我循环的是yearList,而不是slaesList
                //如果没个set的顺序不与category对应循环出的数据是不对滴 
               foreach (var ys in yearList)
                {
                    //判断这个年在该人的列表里是否存在. 
               	if (!(from p in slaesList where p.Key == ys.Key select p).Any(c => c.Key.Equals(ys.Key)))
                    {
                        SDataSet.Append("<set />");
                    }
                    else
                    {
                        string str = slaesList.Single(p => p.Key == ys.Key).Sales;
                        SDataSet.Append("<set name = '" + ys.Key + "' value='" + str + "' />");
                    }
                }
                SDataSet.Append("</dataset>");
            }
            StringBuilder Xmldata = new StringBuilder();
            Xmldata.Append(Scategory.ToString());
            Xmldata.Append(SDataSet.ToString());
            return Xmldata.ToString();
        }

上面代码基本都写了注释,用了一些Lambda 表达式,很是爽. 但本人感觉还应该有更好的写法, 为了使年份和数值对应上,这样做的就是不很灵活了,待我再研究研究,如果有高人请指点一下,..

效果图:

clip_image003



 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值