excel流程配置echart

描述:当前是关于Echarts图表中的 示例。
 
            var data = [
    { name: "Mon_1", time: "Mon", tdCount: 820, ydCount: 810, cost: 0.2, count: 800 },
    { name: "Tue_1", time: "Tue", tdCount: 932, ydCount: 800, cost: 0.3, count: 850 },
    { name: "Wed_1", time: "Wed", tdCount: 901, ydCount: 880, cost: 0.4, count: 900 },
    { name: "Thu_1", time: "Thu", tdCount: 934, ydCount: 900, cost: 0.1, count: 950 },
    { name: "Fri_1", time: "Fri", tdCount: 1290, ydCount: 1200, cost: 0.2, count: 1000 },
    { name: "Sat_1", time: "Sat", tdCount: 1330, ydCount: 1400, cost: 0.6, count: 1050 },
    { name: "Sun_1", time: "Sun", tdCount: 1320, ydCount: 1410, cost: 0.7, count: 1100 },
];

//1-one 2-two 3-three 4-four 5-five 6-six 7-seven 8-eight 9-nine 10-ten
var conf = {
    type: "bar",//图表类型: line,bar/ybar,pie,radar,bar3D,Candlestick
    typeNum: "1",// 图类型编号:line:1~6,bar:1~3,pie:1~4,radar:1~4,bar3D:1~2;[更改数据展示:曲线_柱状图(数据堆叠,以百分比显示;曲线_平滑显示),饼图(圆环,玫瑰图等)]
    layoutNum: "1",//图表布局编号:line/bar:1~7,pie:1~4,radar:1~4,bar3D:1~4;[更改位置:标题位置,图例位置,表格,坐标轴名称]
    styleNum: "1",//图表样式编号:1~4;[更改颜色]
    xkey: "time",//x轴的数据key,[pie图,xkey值为ykey值名称,可无]
    ykey: ["tdCount", "ydCount"],//y轴数据key,[pie图,ykey只能有一个且为数值]
    textObj: {//更改:标题,系列名
        title: "", //标题名 
        seriesNm: { tdCount: "", ydCount: "" }//系列名[line:key根据ykey确定;pie系列名不可修改]
    }
}

var option = getEchartOpt(data, conf);
function getEchartOpt(data, conf) {
    var sType = conf.type;//图类型
    var typeNum = conf.typeNum;//类型编号
    var layoutNum = conf.layoutNum;//布局编号
    var styleNum = conf.styleNum;//样式编号
    var xkey = conf.xkey;//x轴key
    var ykey = conf.ykey;//y轴key
    var xType = conf.xType || 'category';//x轴数据类型:category,time,value;或者通过data判断得出(isNum,new Time()?)
    var textObj = conf.textObj;//标题名,系列名
    //数据渲染
    var series = getSeries(sType, data, xkey, ykey);
    console.log("series", series);
    var opt = getOptTpl(sType, data, xType);
    //类型编号:opt-series
    setTypeNum(sType, typeNum, opt, series);
    //布局编号:opt-series
    setLayoutNum(sType, layoutNum, opt, series);
    //样式编号:opt
    setStyleNum(sType, styleNum, opt);
    //标题名,系列名等修改
    setTextNm(sType, textObj, opt, series);
    //数据合并
    opt.series = series;
    console.log("opt", opt);
    return opt;
}
//获取option模版
function getOptTpl(sType, data, xType) {
    if (sType === "line" || sType === "bar") {
        var option = {
            title: {
                text: '图表标题',
            },
            legend: {
            },
            dataset: {
                source: data
            },
            series: [],
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                    type: 'cross',
                    label: {
                        backgroundColor: '#6a7985'
                    }
                }
            },
            xAxis: {
                type: xType,
                axisLine: {
                    lineStyle: {
                        color: '#999',
                    }
                }
            },
            yAxis: {
                type: 'value',
                axisLine: {
                    lineStyle: {
                        color: '#999',
                    }
                },
                splitLine: {}
            }
        };
    } else if (sType === "ybar") {
        var option = {
            title: {
                text: '图表标题',
            },
            legend: {
            },
            dataset: {
                source: data
            },
            series: [],
            tooltip: {
                trigger: 'item'
            },
            yAxis: {
                type: xType,
                axisLine: {
                    lineStyle: {
                        color: '#999',
                    }
                }
            },
            xAxis: {
                type: 'value',
                axisLine: {
                    lineStyle: {
                        color: '#999',
                    }
                },
                splitLine: {}
            }
        };
    } else if (sType === "pie") {
        var option = {
            title: {
                text: '图表标题',
            },
            legend: {
            },
            dataset: {
                source: data
            },
            series: [],
            tooltip: {
                trigger: 'item'
            }
        }
    } else if (sType === "radar") {
        var option = {
            title: {
                text: '图表标题'
            },
            tooltip: {},
            legend: {},
            radar: {
                // shape: 'circle',
                indicator: []
            },
            series: []
        }
    } else if (sType === "bar3D") {
        var option = {
            title: { text: "图表标题" },
            tooltip: {},
            legend: {},
            xAxis3D: {
                type: xType,
                axisLine: {
                    lineStyle: {
                        color: '#999',
                    }
                }
            },
            yAxis3D: {
                name: "",//默认Y,不显示
                type: 'category',
                axisLine: {
                    lineStyle: {
                        color: '#999',
                    }
                }
            },
            zAxis3D: {
                type: 'value',
            },
            grid3D: {
            },
            series: [{
                type: 'bar3D',
                // stack: "堆叠",
                data: [["a", "", 1], ["b", "", 2], ["c", "", 3]]
            }, {
                type: 'bar3D',
                // stack: "堆叠",//堆叠
                data: [["a", "", 2], ["b", "", 3], ["c", "", 4]]
            }]
        }
    }
    return option;
}
//获取series:添加nameKey
function getSeries(sType, data, xkey, ykey) {
    var allSeries = [];
    if (sType === "line" || sType === "bar") {
        //多个系列
        for (var i = 0; i < ykey.length; i++) {
            var yField = ykey[i];
            allSeries.push({
                name: yField,//'系列名'
                extraYkey: yField,//匹配需要修改的系列名
                type: sType,
                label: {},
                encode: { x: xkey, y: yField }//dataset,数据映射
            });
        }
    } else if (sType === "ybar") {
        //多个系列
        for (var i = 0; i < ykey.length; i++) {
            var yField = ykey[i];
            allSeries.push({
                name: yField,//'系列名'
                extraYkey: yField,//匹配需要修改的系列名
                type: "bar",
                label: {},
                //数据反过来映射
                encode: { x: yField, y: xkey }//dataset,数据映射
            });
        }
    } else if (sType === "pie") {
        var yField = ykey[0];//只取第一个
        var defSeries = {
            name: '',
            type: 'pie',
            radius: '65%',
            center: ['50%', '50%'],
            encode: { value: yField, itemName: xkey }
        }
        allSeries.push(defSeries);
    } else if (sType === "radar") {
        var defSeries = {
            type: "radar",
            data: []
        };
        // 获取雷达指示器名称
        var nameObj = {};
        for (var i = 0; i < ykey.length; i++) {
            var yField = ykey[i];
            var dataObj = ({
                name: yField,//'系列名'
                extraYkey: yField,//匹配需要修改的系列名
                value: []
            });
            for (var j = 0; j < data.length; j++) {
                var dataRow = data[j];
                var yval = dataRow[yField] || 0;//y轴,无数据,赋默认值0
                var name = dataRow[xkey];
                dataObj.value.push(yval);
                //指示器的最大值
                if (nameObj[name] == undefined) {
                    nameObj[name] = 0;
                }
                if (nameObj[name] < yval) {
                    nameObj[name] = yval;
                }
            }
            defSeries.data.push(dataObj);
        }
        //雷达图的指示器,max*1.1倍
        var indicator = [];
        for (var nm in nameObj) {
            indicator.push({ name: nm, max: Number(nameObj[nm] * 1.1) })
        }
        defSeries.indicator = indicator;
        allSeries.push(defSeries);
    } else if (sType === "bar3D") {
        // bar3D的series.data在setTypeNum时生成
        for (var i = 0; i < ykey.length; i++) {
            var yField = ykey[i];
            var defSeries = {
                name: yField,//'系列名'
                extraYkey: yField,//匹配需要修改的系列名
                extraXkey: xkey,
                type: 'bar3D',
                label: {},
                data: []
            }
            allSeries.push(defSeries);
        }
    }
    return allSeries;
}
//类型编号:series[sobj.stack,sobj.smooth];opt[tooltip.trigger]
function setTypeNum(sType, typeNum, opt, series) {
    if (sType === "line") {
        // 1:数据实际效果展示,2:堆叠,3:面积;
        // 456对应123的基础上,曲线变成_平滑显示
        if (typeNum === "2") {
            series.forEach(function (sobj) {
                sobj.stack = "堆叠";//多个系列,x轴相同,y数据值叠加后显示;只有一个系列,类型编号无意义
            });
        } else if (typeNum === "3") {
            series.forEach(function (sobj) {
                sobj.areaStyle = {};//面积:区域填充样式
            });
        } else if (typeNum === "4") {
            series.forEach(function (sobj) {
                sobj.smooth = true;
            });
        } else if (typeNum === "5") {
            series.forEach(function (sobj) {
                sobj.stack = "堆叠";//多个系列,数据值叠加后显示
                sobj.smooth = true;
            });
        } else if (typeNum === "6") {
            series.forEach(function (sobj) {
                sobj.areaStyle = {};//面积
                sobj.smooth = true;
            });
        }
        //百分比:一个系列:基准线100%,无意义;两个系列:系列1每个点/系列2每个点;只有一个系列,类型编号无意义
    } else if (sType === "bar"||sType==="ybar") {
        //柱状图修改tip类型
        opt.tooltip.trigger = "item";
        // 1:数据实际效果展示,2:堆叠,3:条形图_横向展示(xy互换);
        if (typeNum === "2") {
            series.forEach(function (sobj) {
                sobj.stack = "堆叠";//多个系列,x轴相同,y数据值叠加后显示;只有一个系列,类型编号无意义
            });
        } 
    } else if (sType === "pie") {
        // 1:扇形面积:展现数据的大小
        // 2:圆环展示_圆环面积展示数据大小
        // 3:扇区圆心角展现数据的百分比,半径展现数据的大小。roseType:'radius'
        // 4:所有扇区圆心角相同,仅通过半径展现数据大小。'area'
        if (typeNum === "2") {
            //https://gallery.echartsjs.com/editor.html?c=xG61SsUMJi
            series.forEach(function (sobj) {
                sobj.radius = ['25%', '70%'];
            });
        } else if (typeNum === "3") {
            series.forEach(function (sobj) {
                sobj.roseType = 'radius';
            });
        } else if (typeNum === "4") {
            series.forEach(function (sobj) {
                sobj.roseType = 'area';
            });
        }
    } else if (sType === "radar") {
        //指示器
        opt.radar.indicator = series[0].indicator;
        delete series[0].indicator;
        //1:默认:绘制类型_多角形
        //2:面积:区域填充样式
        //3:节点放大,正方形展示;
        //4:绘制类型:圆形,移除分割线
        if (typeNum === "2") {
            series.forEach(function (sobj) {
                sobj.areaStyle = {};
            });
        } else if (typeNum === "3") {
            series.forEach(function (sobj) {
                sobj.symbol = "rect";
                sobj.symbolSize = 10;
            });
        } else if (typeNum === "4") {
            opt.radar.splitLine = { show: false };
            opt.radar.shape = 'circle' //支持 'polygon' 和 'circle'
        }
    } else if (sType === "bar3D") {
        // 1:默认正常3D状态
        // 2:堆叠显示:tootip提示y:"",z是每一项数据,无总和
        if (typeNum === "1") {
            series.forEach(function (sobj) {
                var yField = sobj.extraYkey;
                var xkey = sobj.extraXkey;
                for (var j = 0; j < data.length; j++) {
                    var dataRow = data[j];
                    var yval = dataRow[yField] || 0;//无数据,赋默认值0
                    var name = dataRow[xkey];
                    sobj.data.push([name, yField, yval]);
                }
            })
        } else if (typeNum === "2") {
            series.forEach(function (sobj) {
                sobj.stack = "堆叠";
                var yField = sobj.extraYkey;
                var xkey = sobj.extraXkey;
                for (var j = 0; j < data.length; j++) {
                    var dataRow = data[j];
                    var yval = dataRow[yField]||0;
                    var name = dataRow[xkey];
                    sobj.data.push([name, "", yval]);//y轴相同
                }
            })
        } else if (typeNum === "3") { }
    }
}
//布局编号:opt[title.left/top/show,legend,yAxis];series[sobj.label]
function setLayoutNum(sType, layoutNum, opt, series) {
    if (sType === "line" || sType === "bar" || sType === "ybar") {
        //1默认:title:top-0,left-0;legend:top-0,left-center;顶左-顶中
        if (layoutNum === "2") {//顶中-右中_垂直 1
            // opt.title.top = "";
            opt.title.left = "center";
            opt.legend.right = "0";
            opt.legend.top = "center";
            opt.legend.orient = "vertical";//horizontal,vertical
        } else if (layoutNum === "3") {//顶中-顶(下)中-y无 2
            opt.title.left = "center";
            opt.legend.top = "6%";//title下
            opt.legend.left = "center";
            opt.yAxis.show = false;
        } else if (layoutNum === "4") {//顶中-底中-y_轴线无 3
            opt.title.left = "center";
            opt.legend.bottom = "0";
            opt.legend.left = "center";
            opt.yAxis.axisLine.show = false;
        } else if (layoutNum === "5") {//无-底中-y_分割线无 4
            opt.title.left = "center";
            opt.legend.bottom = "0";
            opt.legend.left = "center";
            opt.yAxis.splitLine.show = false;
            //跳过excel布局:表格5,6,7
        } else if (layoutNum === "6") {//无-底中-y无-折线_值标注 8
            opt.title.show = false;
            opt.legend.bottom = "0";
            opt.legend.left = "center";
            opt.yAxis.show = false;
            series.forEach(function (sobj) {
                sobj.label = {
                    show: true
                }
            });
        } else if (layoutNum === "7") {//无-无-xy无 11
            opt.title.show = false;
            opt.legend.show = false;
            opt.xAxis.show = false;
            opt.yAxis.show = false;
        }
    } else if (sType === "pie" || sType === "radar") {
        if (layoutNum === "2") {//顶中-右中_垂直
            opt.title.left = "center";
            opt.legend.right = "0";
            opt.legend.top = "center";
            opt.legend.orient = "vertical";//horizontal,vertical
        } else if (layoutNum === "3") {//顶中-顶(下)中
            opt.title.left = "center";
            opt.legend.top = "6%";//title下
            opt.legend.left = "center";
        } else if (layoutNum === "4") {//中中-中中
            opt.title.x = 'center';
            opt.title.y = 'center';
        }
    } else if (sType === "bar3D") {
        if (layoutNum === "2") {//顶中-右中_垂直
            opt.title.left = "center";
            opt.legend.right = "0";
            opt.legend.top = "center";
            opt.legend.orient = "vertical";//horizontal,vertical
        } else if (layoutNum === "3") {//顶中-顶(下)中
            opt.title.left = "center";
            opt.legend.top = "6%";//title下
            opt.legend.left = "center";
        } else if (layoutNum === "4"){
            series.forEach(function (sobj) {
                sobj.label = {
                    show: true
                }
            });
        }
    }
}
//样式编号:opt[color]
function setStyleNum(sType, styleNum, opt) {
    // if (sType === "line" || sType === "bar" || sType === "pie" || sType === "ybar" || sType === "radar") {
    var styleObj = {// 颜色模版
        //0,echart默认的
        "1": ["#f845f1", "#ad46f3", "#5045f6", "#4777f5", "#44aff0", "#45dbf7", "#f6d54a", "#f69846", "#ff4343"],
        "2": ['#afa3f5', '#00d488', '#3feed4', '#3bafff', '#f1bb4c', "red", "blue"],
        "3": ['#eb2100', '#d0570e', '#d0a00e', '#34da62', '#00e9db', '#00c0e9', '#0096f3', '#33CCFF', '#33FFCC', '#eb3600'],
        "4": ["#8d7fec", "#5085f2", "#e75fc3", "#f87be2", "#f2719a", "#fca4bb", "#f59a8f", "#fdb301", "#57e7ec", "#cf9ef1", "#57e7ec", "#cf9ef1"],
    }
    // } else if (sType === "radar") {

    // }
    var styleTpl = styleObj[styleNum];
    if (styleTpl != undefined) {
        opt.color = styleTpl;
    }
}
//文本名修改:opt[title.text];series[sobj.name]
function setTextNm(sType, textObj, opt, series) {
    //对象合并:assign_谷歌45+
    // var textObj=Object.assign({ title: "", seriesNm: {} }, textObj);
    if (isObject(textObj) == false) {
        return false;
    }
    //修改标题
    var title = textObj.title;
    if (isNonEmptyStr(title)) {
        opt.title.text = title;
    }
    //修改系列名
    if (sType === "line" || sType === "bar" || sType === "ybar" || sType === "bar3D") {//pie未处理
        var seriesNm = textObj.seriesNm || {};
        for (k in seriesNm) {
            var name = seriesNm[k];
            if (isNonEmptyStr(name)) {
                //break
                series.forEach(function (sobj) {
                    if (sobj.extraYkey === k) {
                        sobj.name = name;
                    }
                });
            }
        }
    }
}


function isNonEmptyStr(str) {
    return typeof str === "string" && str.length > 0;
}
//判断是否是对象
function isObject(pm) {
    return Object.prototype.toString.call(pm) === "[object Object]";
}

/*
//dataset方式:key值为null,"",但不能没有key
//tooltip写在series里>option里
//提取
var fnTpl = function (sobj) {
    sobj.stack = "堆叠";//多个系列,数据值叠加后显示
}
series.forEach(fnTpl)

//标注点/线:最大值/最小值,指定值?
                    markPoint: {
            data: [
                {type: 'max', name: '最大值'}
            ],
            animationDelay: 2000,
            animationDuration: 1000
        },
        // areaStyle: {},//区域填充样式
//颜色来源
    https://gallery.echartsjs.com/editor.html?c=xHkjKKrz_M
        "#f845f1","#ad46f3","#5045f6","#4777f5","#44aff0","#45dbf7","#f6d54a","#f69846","#ff4343"
    https://gallery.echartsjs.com/editor.html?c=xG61SsUMJi
        var  colorList=['#afa3f5', '#00d488', '#3feed4', '#3bafff', '#f1bb4c'];
    https://gallery.echartsjs.com/editor.html?c=xhmv-1o6XS
        var myColor = ['#eb2100', '#eb3600', '#d0570e', '#d0a00e', '#34da62', '#00e9db', '#00c0e9', '#0096f3', '#33CCFF', '#33FFCC'];
    https://gallery.echartsjs.com/editor.html?c=xbMIK6kQkR
        "#8d7fec","#5085f2","#e75fc3","#f87be2","#f2719a","#fca4bb","#f59a8f","#fdb301","#57e7ec","#cf9ef1","#57e7ec","#cf9ef1"
// 第1 first 1st,第2 second 2nd,第3 third 3rd,第4 fourth 4th,第5 fifth 5th,
// 第6 sixth 6th,第7 seventh 7th,第8 eighth 8th,第9 ninth 9th,第10 tenth 10th,

    */