zoukankan      html  css  js  c++  java
  • Asp.NET Core制作图表

                                                   Asp.NET Core制作图表(折线图,条形图和饼图)

    第一步:在原有项目的解决方案右键-->添加-->新建项目,在弹出框选中“类库(.net core)”,类名设为“HighchartsNETCore”

                                                                                   图1

     展开HighchartsNETCore,在其下的“依赖项”右键选中“管理NuGet程序包” ,在弹出框输入“Razor.Runtime”    ,并安装图3蓝色选中部分。                                                                             

                                                                                                               图2

                                                                                                                 

                                                                                                            图3

     第二步:在HighchartsNETCore右键添加类,类名为HighChartsTagHelper,接下来在它里面写代码:

    using Microsoft.AspNetCore.Razor.TagHelpers;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace HighchartsNETCore
    {
        public class HighChartsTagHelper : TagHelper
        {
            /// <summary>
            /// 图表标题
            /// </summary>
            [HtmlAttributeName("title")]
            public string Title { get; set; }
            /// <summary>
            /// 图表类型
            /// </summary>
            [HtmlAttributeName("type")]
            public ChartType Type { get; set; }
            /// <summary>
            /// 图表2级标题
            /// </summary>
            [HtmlAttributeName("subtitle")]
            public string SubTitle { get; set; }
    
            /// <summary>
            /// 数据对象
            /// </summary>
            [HtmlAttributeName("series")]
            public ChartsSeries Series { get; set; }
    
            /// <summary>
            /// 一些附加选项
            /// </summary>
            [HtmlAttributeName("plotoptions")]
            public string PlotOptions { get; set; }
            /// <summary>
            /// X轴选项
            /// </summary>
            [HtmlAttributeName("xAxis")]
            public List<object> XAxis { get; set; }
            /// <summary>
            /// Y轴选项 默认可以只填名称
            /// </summary>
            [HtmlAttributeName("yAxis")]
            public string YAxis { get; set; }
    
            /// <summary>
            /// 提示格式
            /// </summary>
            [HtmlAttributeName("Tooltip")]
            public string Tooltip { get; set; }
            /// <summary>
            /// 图表层id(容器)
            /// </summary>
            [HtmlAttributeName("id")]
            public string Id { get; set; }
    
            /// <summary>
            /// 图标下方标识是否显示 默认不显示
            /// </summary>
            [HtmlAttributeName("legend")]
            public bool Legend { get; set; }
    
            /// <summary>
            /// 高级功能,多个数据集,多条图表,饼图不需要。
            /// </summary>
            [HtmlAttributeName("serieslist")]
            public List<ChartsSeries> SeriesList { get; set; }
    
            [HtmlAttributeName("width")]
            public int Width { get; set; }
    
            [HtmlAttributeName("height")]
            public int Height { get; set; }
    
            private void HighChartsJs(StringBuilder jscode)
            {
                jscode.Append("$(function(){$('#" + Id + "').highcharts({ ");
                jscode.Append("credits: { enabled: false },");
                jscode.Append("chart:{ type: '" + Type.ToString().ToLower() + "'");
                if (Width > 0)
                    jscode.Append("," + Width);
                if (Height > 0)
                    jscode.Append(",height:" + Height);
                jscode.Append("},");
                if (!string.IsNullOrEmpty(Title))
                    jscode.Append("title: { text: '" + Title + "'},");
                if (!string.IsNullOrEmpty(SubTitle))
                    jscode.Append("subtitle: { text: '" + SubTitle + "'},");
                //判断类型及数据显示
                if (XAxis != null && Type != ChartType.Pie)
                {
                    XAxisToString(jscode, XAxis);
                }
                else if (Series.SeriesData != null && Type != ChartType.Pie)
                {
                    XAxisToString(jscode, Series.SeriesData.Keys.ToList());
                }
                else if (SeriesList != null && SeriesList.Count > 0)
                {
                    XAxisToString(jscode, SeriesList[0].SeriesData.Keys.ToList());
                }
                if (!string.IsNullOrEmpty(YAxis))
                {
                    if (YAxis.IndexOf("title") < 0)
                    {
                        jscode.Append("yAxis: { title:{ text:'" + YAxis + "'}},");
                        if (string.IsNullOrEmpty(Tooltip))
                            jscode.Append("tooltip: { valueSuffix:'" + YAxis + "' },");
                    }
                    else
                    {
                        jscode.Append("yAxis: {" + YAxis + "},");
                    }
                }
                jscode.Append("legend: { enabled: " + Legend.ToString().ToLower() + " },");
                if (!string.IsNullOrEmpty(Tooltip))
                    jscode.Append("tooltip: {" + Tooltip + "},");
                if (!string.IsNullOrEmpty(PlotOptions))
                    jscode.Append("plotOptions:{" + PlotOptions + "},");
                //数据处理方法
                SeriesToString(jscode);
                jscode.Append(" }); });");
            }
    
            private void SeriesToString(StringBuilder sb)
            {
                sb.Append("series: [");
                string seriesdata = string.Empty;
                if (Series.SeriesData != null)
                {
                    seriesdata = SeriesDataToString(Series);
                }
                if (SeriesList != null && SeriesList.Count != 0)
                {
                    foreach (ChartsSeries ser in SeriesList)
                    {
                        seriesdata += SeriesDataToString(ser) + ",";
                    }
                    seriesdata = seriesdata.TrimEnd(',');
                }
                sb.Append(seriesdata);
                sb.Append("]");
            }
    
            /// <summary>
            /// 数据部分转成js代码
            /// </summary>
            /// <param name="series"></param>
            /// <returns></returns>
            private string SeriesDataToString(ChartsSeries series)
            {
                string seriesdata = "{ name: '" + series.SeriesName + "',data:[";
                foreach (var item in series.SeriesData)
                {
                    seriesdata += "['" + item.Key + "'," + item.Value + "],";
                }
                seriesdata = seriesdata.TrimEnd(',');
                seriesdata += "] }";
                return seriesdata;
            }
            /// <summary>
            /// x轴上数据转换
            /// </summary>
            /// <param name="sb"></param>
            /// <param name="xAxis"></param>
            private void XAxisToString(StringBuilder sb, List<object> xAxis)
            {
                sb.Append("xAxis: { categories: [");
                string xaxis = string.Empty;
                foreach (var item in xAxis)
                {
                    xaxis += "'" + item + "',";
                }
                xaxis = xaxis.TrimEnd(',');
                sb.Append(xaxis);
                sb.Append("]},");
            }
    
            public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                if (Series == null) return;
                output.Attributes.SetAttribute("title", "HighchartsNET自动生成 By:LineZero");
                output.Attributes.SetAttribute("id", Id);
                StringBuilder style = new StringBuilder("margin:0px auto;min-400px;");
                if (Width > 0)
                    style.Append($"{Width}px;");
                if (Height > 0)
                    style.Append($"heigth:{Height}px;");
                output.Attributes.SetAttribute("style", style.ToString());
                output.TagName = "div";
                StringBuilder innerhtml = new StringBuilder();
                innerhtml.Append("<script>");
                HighChartsJs(innerhtml);
                innerhtml.Append("</script>");
                output.PostElement.AppendHtml(innerhtml.ToString());
            }
    
            public class ChartsSeries
            {
                public object SeriesName { get; set; }
                public Dictionary<object, object> SeriesData { get; set; }
            }
            public enum ChartType
            {
                Column,
                Pie,
                Line,
                Bar
            }
        }
    }
    View Code

    新建一个名为HomeController的控制器,直接上代码:

    补充说明:(先在Models添加一个Tasks(与数据库同名)模型,Tasks里面包含字段Teachername

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Threading.Tasks;
    
    using Microsoft.AspNetCore.Mvc;
    
    using System.Data;
    
    using System.Text;
    
    using lwz.Models;
    
    using Microsoft.EntityFrameworkCore;
    
    using MySql.Data.MySqlClient;
    
    using lwz.Date;
    
    using Microsoft.AspNetCore.Mvc.RazorPages;
    
    using Microsoft.AspNetCore.Http;
    
    using System.Net.Http.Headers;
    
    using System.IO;
    
    using static HighchartsNETCore.HighChartsTagHelper;
    
     
    
    namespace lwz.Controllers
    
    {
    
        public class HomeController : Controller
    
        {
    
     
    
            private DataContext con;
    
     
    
            public HomeController(DataContext context)
    
            {
    
                this.con = context;
    
            }//通过析构函数来依赖注入
    
     
    
            public IActionResult Index()
    
            {
    
                //ChartsSeries series = new ChartsSeries();
    
                //Dictionary<object, object> dic = new Dictionary<object, object>();
    
                //Random r = new Random();
    
                //for (int i = 0; i < 12; i++)
    
                //{
    
                //    dic.Add(DateTime.Now.AddDays(i).ToString("yyyyMMdd"), r.Next(20));
    
                //}
    
                //series.SeriesName = "温度";
    
                //series.SeriesData = dic;
    
                //ViewBag.Series = series;
    
                return View();
    
               
    
            }
    
     
    
            public IActionResult ChartHomeworkCount()//单独增加数据
    
            {
    
                ChartsSeries series = new ChartsSeries();
    
                Dictionary<object, object> dic = new Dictionary<object, object>();
    
     
    
                var Tasks = from p in con.Tasks
    
                            select p;
    
               
    
                var Tasks1 = Tasks.Where(d => d.Teachername == "宋光");
    
                dic.Add("宋光", Tasks1.Count());
    
                Tasks = from p in con.Tasks
    
                        select p;          
    
     
    
                var Tasks2 = Tasks.Where(d => d.Teachername == "习一平");
    
                dic.Add("习一平", Tasks2.Count());
    
                Tasks = from p in con.Tasks
    
                        select p;
    
     
    
                var Tasks3 = Tasks.Where(d => d.Teachername == "梁老师");
    
                dic.Add("梁老师", Tasks3.Count());
    
                Tasks = from p in con.Tasks
    
                        select p;
    
     
    
                var Tasks4 = Tasks.Where(d => d.Teachername == "马玉");
    
                dic.Add("马玉", Tasks4.Count());
    
                Tasks = from p in con.Tasks
    
                        select p;
    
     
    
                var Tasks5 = Tasks.Where(d => d.Teachername == "郭老师");
    
                dic.Add("郭老师", Tasks5.Count());
    
                Tasks = from p in con.Tasks
    
                        select p;
    
     
    
                var Tasks6 = Tasks.Where(d => d.Teachername == "李家宝");
    
                dic.Add("李家宝", Tasks6.Count());
    
                Tasks = from p in con.Tasks
    
                        select p;
    
     
    
     
    
                series.SeriesName = "作业量/条";
    
                series.SeriesData = dic;
    
                ViewBag.Series = series;
    
                return View();
    
            }
    
     
    
            public IActionResult Index3()//循环读取多条数据
    
            {
    
                //ChartsSeries series = new ChartsSeries();
    
                //Dictionary<object, object> dic = new Dictionary<object, object>();
    
                //var kucuns = from p in con.kucun
    
                //             select p;
    
                //for (int i = 1; i <= kucuns.Count(); i++) 
    
                //{
    
                //    var kucunnum = kucuns.Where(d => d.KucunId == i).FirstOrDefault();
    
                //    dic.Add(kucunnum.Name, kucunnum.Number);
    
                //}
    
                //series.SeriesName = "商品库存量";
    
                //series.SeriesData = dic;
    
                //ViewBag.Series = series;
    
                return View();
    
            }
    
        } 
    
    }
    HomeController

    在_ViewImports.cshtml里引入(其中lwz为我原有的项目名,你们因名而异) 

    1 @using lwz
    2 @using lwz.Models
    3 @using lwz.Date
    4 @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    5 @addTagHelper *,HighchartsNETCore
    _ViewImports.cshtml

     在名为Home的文件夹下添加视图ChartHomeworkCount.cshtml视图,直接上代码:

    补充:(记得要先引用js代码)

    @{
        ViewData["Title"] = "ChartHomeworkCount";
    }
    <h2><a asp-controller="Teacher" asp-action="TeacherTasks" class="btn btn-default">返回布置作业页面</a></h2>
    @*<script src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>
        <script src="http://cdn.hcharts.cn/highcharts/highcharts.js"></script>*@
    @*把地址上的代码复制到自己的项目里,就不用每次都需要联网才可以使用script了*@
    <script src="~/js/jquery-1.8.3.min.js"></script>
    <script src="~/js/highchartst.js"></script>
    <div>
        <high-charts id="demoline" title="信息班各老师布置作业数量线图" subtitle="各种类数量统计" type="Line" series="ViewBag.Series"></high-charts>
        <high-charts id="democolumn" title="信息班各老师布置作业数量柱图" subtitle="各种类数量统计" type="Column" series="ViewBag.Series"></high-charts>
        <high-charts id="demopie" title="信息班各老师布置作业数量饼图" subtitle="各种类数量统计" type="Pie" series="ViewBag.Series"></high-charts>
    </div>
    View Code

    第三步?当然是运行啦,看结果,似不似很牛X?

     ps:此文为本人整合别人的博客写的,若有冒犯之处,敬请原谅。只因本人是菜鸟,所以比大牛写的详细点,只供学习所用。

    大牛LineZero's Blog的源项目:https://github.com/linezero/HighchartsNET

  • 相关阅读:
    View使用总结
    IPC机制总结
    Activity 启动模式总结
    StrictMode 严格模式
    dumpsys, traceView调试命令
    Monkey命令及调试
    Android Studio使用tips
    Java常用数据结构Set, Map, List
    JavaScript String 小球重力弹回
    JavaScript Array 数组方法汇总
  • 原文地址:https://www.cnblogs.com/fzqm-lwz/p/9704973.html
Copyright © 2011-2022 走看看