应用场景是这个样子的:要做导出数据到PDF的功能,涉及到文本、表格、图表等内容。在做图表功能时,发现之前用Highcharts做的图表根本就不能集成到PDF中。这里需要一个能在程序后台就生成图表的功能,通过两个步骤进行集成:

  1)将图表生成到一个图片文件中,存储在服务器上;

  2)根据指定的图片路径,将图片集成到PDF。

  那么集成的核心就为:如何在.net程序后台就生成一个图表。

  这里介绍的是:

    1)如何利用 Mvc Chart在程序的后台生成图表;

    2)如何利用 Mvc Chart在前端生成图表。

  必要条件:添加 using System.Web.Helpers;引用

一、在程序后台生成图表

  先看下生成的效果:

制作这样一个图表,需要经过以下几个步骤:

Step 1:创建图表对象

Chart chart = new Chart(500, 400, ChartTheme.Blue);//ChartTheme:图表主题

Step 2:添加图表标题

chart.AddTitle(“2014年城市人口统计”);

Step 3:提供图表的数据点和系列特性,它包含以下几个部分

//提供图表的数据点和系列特性
chart.AddSeries(
name: “2014population”,//系列的唯一名称 做图例时有用
    chartType: ChartType.Column.ToString(),//图表类型 柱状图、折线图、饼图...
    xValue: new List<string>() { "北京", "上海", "广州", "深圳", "重庆" },//要沿 X 轴绘制的值
    yValues: new List<float>() { 1962.24f, 2301.91f, 1270.08f, 1035.79f, 2884.62f }//要沿 Y 轴绘制的值
);

Step 4:设置X轴和Y轴的值

chart.SetXAxis(“城市”);
chart.SetYAxis(“人口”);

Step 5:保存图片

chart.Save(“D:\2014population.jpeg”);

  现在,打完收功。名为:2014population.jpeg的图片就已经生成在指定的路径下了。有没有觉得很简单、快速?

  可现在是一个Y轴只有一个值,当有多个值时怎么办呢?即要使之达到下面这样的效果:

  现在,我们通过在前台生成的方式来看这样的效果是如何达到的:

二:在程序前端生成图表

  在前面的第三步:Step 3:提供图表的数据点和系列特性 里,提供了生成图表的数据来源。如果要使一个Y轴对象有多个值,达到上面的效果,只需要再写一个 AddSeries(... ...),即可。除此之外,你还需要:

  将 .Save(...)修改为:.Write()

  是的,前台和后台生成图表的差别,就只有这一处。来看看在前端生成图表的完整代码:

    <div>
@{
Chart t2 = new Chart(width: , height: , theme: ChartTheme.Blue)
.AddTitle("2013~2014城市人口统计")
.AddLegend("年份")
.SetXAxis("城市")
.SetYAxis("人口 【单位:万人】")
.AddSeries(
name: "2013年",
xValue: new[] {
"北京",
"上海",
"广州",
"深圳",
"重庆" },
yValues: new[] {
1962.24f,
2301.91f,
1270.08f,
1035.79f,
2884.62f
}
)
.AddSeries(
name: "2014年",
xValue: new[] {
"北京",
"上海",
"广州",
"深圳",
"重庆" },
yValues: new[] {
234.24f,
4234.91f,
2342.08f,
4234.79f,
2342.62f
}
)
.Write();
}
</div>

三:封装

  为方便图片的生成,对在后台生成的代码做如下的封装:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Helpers; namespace Seal_Common
{
/// <summary>
/// 绘制图表,并保存在服务器中[必要引用::System.Web.Helpers]
/// </summary>
public class ChartHelper
{
private const int chartWidth = ;
private const int chartHeight = ;
/// <summary>
/// 后台生成图片, 并保存在服务器中
/// </summary>
/// <param name="name">系列的唯一名称 做图例时有用</param>
/// <param name="title">图表标题</param>
/// <param name="names">list string 名称(坐标轴中的X轴)</param>
/// <param name="values">list float 值(坐标轴中的Y轴)</param>
/// <param name="saveurl">保存到服务的URL</param>
/// <param name="charttype">图表类型 默认为柱形图 ChartType.Column</param>
/// <param name="width">宽度 默认500</param>
/// <param name="height">高度 默认300</param>
/// <param name="Xtitle">X轴标题</param>
/// <param name="Ytitle">Y轴标题</param>
/// <param name="charttheme">图表样式</param>
public void GenerateChart(string name, string title, List<string> names, List<float> values, string saveurl, ChartType charttype, int width = , int height = , string Xtitle = "", string Ytitle = "", string charttheme = ChartTheme.Vanilla)
{
try
{
DateTime dt = DateTime.Now;
Chart chart = new Chart(width, height, charttheme.ToString());
chart.AddTitle(title);
chart.AddSeries(
name: name,
chartType: charttype.ToString(),
xValue: names,
yValues: values
);
chart.SetXAxis(Xtitle);
chart.SetYAxis(Ytitle);
chart.Save(saveurl);
}
catch (Exception ex)
{ }
}
}
/// <summary>
/// 图表类型
/// </summary>
public enum ChartType
{
/// <summary>
/// 点图类型
/// </summary>
Point = ,
/// <summary>
/// 快速点图类型
/// </summary>
FastPoint = ,
/// <summary>
/// 气泡图类型
/// </summary>
Bubble = ,
/// <summary>
/// 折线图类型
/// </summary>
Line = ,
/// <summary>
/// 样条图类型
/// </summary>
Spline = ,
/// <summary>
/// 阶梯线图类型
/// </summary>
StepLine = ,
/// <summary>
/// 快速扫描线图类型
/// </summary>
FastLine = ,
/// <summary>
/// 条形图类型
/// </summary>
Bar = ,
/// <summary>
/// 堆积条形图类型
/// </summary>
StackedBar = ,
/// <summary>
/// 百分比堆积条形图类型
/// </summary>
StackedBar100 = ,
/// <summary>
/// 柱形图类型
/// </summary>
Column = ,
/// <summary>
/// 堆积柱形图类型
/// </summary>
StackedColumn = ,
/// <summary>
/// 百分比堆积柱形图类型
/// </summary>
StackedColumn100 = ,
/// <summary>
/// 面积图类型
/// </summary>
Area = ,
/// <summary>
/// 样条面积图类型
/// </summary>
SplineArea = ,
/// <summary>
/// 堆积面积图类型
/// </summary>
StackedArea = ,
/// <summary>
/// 百分比堆积面积图类型
/// </summary>
StackedArea100 = ,
/// <summary>
/// 饼图类型
/// </summary>
Pie = ,
/// <summary>
/// 圆环图类型
/// </summary>
Doughnut = ,
/// <summary>
/// 股价图类型
/// </summary>
Stock = ,
/// <summary>
/// 线图类型
/// </summary>
Candlestick = ,
/// <summary>
/// 范围图类型
/// </summary>
Range = ,
/// <summary>
/// 样条范围图类型
/// </summary>
SplineRange = ,
/// <summary>
/// 范围条形图类型
/// </summary>
RangeBar = ,
/// <summary>
/// 范围柱形图类型
/// </summary>
RangeColumn = ,
/// <summary>
/// 雷达图类型
/// </summary>
Radar = ,
/// <summary>
/// 极坐标图类型
/// </summary>
Polar = ,
/// <summary>
/// 误差条形图类型
/// </summary>
ErrorBar = ,
/// <summary>
/// 盒须图类型
/// </summary>
BoxPlot = ,
/// <summary>
/// 砖形图类型
/// </summary>
Renko = ,
/// <summary>
/// 新三值图类型
/// </summary>
ThreeLineBreak = ,
/// <summary>
/// 卡吉图类型
/// </summary>
Kagi = ,
/// <summary>
/// 点数图类型
/// </summary>
PointAndFigure = ,
/// <summary>
/// 漏斗图类型
/// </summary>
Funnel = ,
/// <summary>
/// 棱锥图类型
/// </summary>
Pyramid = ,
}
#region 使用方式
// ChartHelper charthelper = new ChartHelper();
// string saveurl = @"C:\Users\zq\Documents\visual studio 2013\Projects\Seal_Main\Seal_Console\bin\Debug\PDFDOCUMENT\123.jpeg";
// List<string> names = new List<string>() {
// "北京",
// "上海",
// "广州",
// "深圳",
// "重庆"
// };
// List<float> values = new List<float>() {
// 1962.24f,
// 2301.91f,
// 1270.08f,
// 1035.79f,
// 2884.62f
// };
// charthelper.GenerateChart("2013~2014城市人口统计", names, values, saveurl, ChartType.Column, 500, 400, "城市", "人口", ChartTheme.Vanilla);
#endregion
}

四:后记

  Mvc Chart做为一个轻量的VS自带图表插件,操作过程简单、快速。但默认样式过于简陋,如果要自定义样式,并不轻松,可尝试ChartTheme的自定义扩展。另外,为了更好的体验效果,Mvc Chart并不能替代Highcharts等前端JS图表插件。

程序环境:Win8.1, Visual Studio 2013 Professional 2013 Update3, MVC 4, System.Web.Helpers 程序版本v2.0.0 运行时版本v4.0.30319

利用MVC Chart 打造后台图表、前端图表的更多相关文章

  1. ASP.NET MVC 富文本Ueditor编辑 后台传值前端乱码解决方案

    只是将当前内容String当成Html插入,我想是跟数据类型转换差不多 //把内容赋值给ueditor var ue = UE.getEditor('editor');//实例化 ue.ready(f ...

  2. ASP.NET MVC搭建项目后台UI框架—1、后台主框架

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  3. springmvc后台接前端的参数,数组,集合,复杂对象等

    springmvc后台接前端的参数,数组,集合,复杂对象等 参考地址:https://blog.csdn.net/feicongcong/article/details/54705933  常用的几种 ...

  4. Echarts一个页面加载多个图表及图表自适应

    Echarts一个页面加载多个图表及图表自适应 模块化加载 //入口 require.config({ paths: { echarts: 'http://echarts.baidu.com/buil ...

  5. 利用webuploader插件上传图片文件,完整前端示例demo,服务端使用SpringMVC接收

    利用WebUploader插件上传图片文件完整前端示例demo,服务端使用SpringMVC接收 Webuploader简介   WebUploader是由Baidu WebFE(FEX)团队开发的一 ...

  6. ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...

  7. java后台对前端输入的特殊字符进行转义

    转自:http://www.cnblogs.com/yangzhilong/p/5667165.html java后台对前端输入的特殊字符进行转义 HTML: 常见的帮助类有2个:一个是spring的 ...

  8. ASP.NET MVC搭建项目后台UI框架—2、菜单特效

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  9. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

随机推荐

  1. MySQL 5.7 新备份工具mysqlpump 使用说明 - 运维小结

    之前详细介绍了Mysqldump备份工具使用,下面说下MySQL5.7之后新添加的备份工具mysqlpump.mysqlpump是mysqldump的一个衍生,mysqldump备份功能这里就不多说了 ...

  2. 【IT笔试面试题整理】字符串转数组+数组转字符串

    [试题描述]定义一个函数,字符串转数组数组转字符串 [参考代码] public static int strToInt(String str) { int i = 0, num = 0; char[] ...

  3. OpenSSL修复加密漏洞、加强Logjam防御

    来源:TechTarget中国作者:Michael Heller翻译:张程程 OpenSSL项目团队为其密码库发布补丁以修复一个严重的漏洞(该漏洞可能允许攻击者解密HTTPS通信),同时强化对Logj ...

  4. ASP.NET MVC5+EF6+LayUI实战教程,通用后台管理系统框架(4)- 漂亮的登录界面

    前言 这一讲,给大家添加登录页面 实现 添加Login的Index视图 @{ Layout = null; } <!DOCTYPE html> <html class="l ...

  5. ASP.NET MVC5+EF6+LayUI实战教程,通用后台管理系统框架(2)

    前言 本节先给大家搭建UI部分,让大家能看到点东西,就好像所有编程书里,开始都是一个Hello World一样 开始搭建 首先建立空白解决方案,我们命名为BYCMS 然后添加新项目BYCMS 我习惯用 ...

  6. Re:从零开始的Spring Session(一)

    Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了.最近在研究跨域单点登录的实现时,发现对于Session和Cookie的了解,并不是很深入,所以打算写两篇 ...

  7. 自动加载的iframe高度自适应

    动态产生iframe,自动加载至body中,还有一个功能就是iframe的高度自适应,下面代码测试于IE和Firefox,Chrome:

  8. 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。

    如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...

  9. swagger2的使用

    springboot项目里怎么使用swagger2? 1.maven依赖 <dependency> <groupId>io.springfox</groupId> ...

  10. 批量导出VBA工程中的Source

    在做Excel宏相关项目的开发和维护过程中,我们经常需要导出VBA中的Source,但是Excel提供的宏编辑器中只能一个文件一个文件地导出,很不方便. 下面介绍2种批量导出的方法: 1.Source ...