鱼C论坛

 找回密码
 立即注册
查看: 3712|回复: 0

[学习笔记] Echarts 数据视图 生成Excel的方法2

[复制链接]
发表于 2021-4-23 08:01:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今日计划完成:饼图修改dataView样式,修改为表格的形式,然后添加将其输出为Excel的功能。
解决的问题:1.数据获取问题,因为饼图的数据源是二维数组,且内部元素是有键值的,但是我在引用数据时忘记写成键值series[i].data[j][‘value’]而是写成series[i].data[j][0],因此一直无法获取到数据。2.表格显示问题,由于饼图有两个,我将两个饼图的数据合并展示,其表格的头部元素共有6个,由于使用了之前的柱状图的代码,导致数据全部集中在前三列,后三列空白,于是将源代码略作修改,将
table += '<tr>' + tdBodys + '</tr>';
移出外循环。
3.在测试过程中意外发现饼图数据与直方图数据对不上,检查完数据库之后发现,直方图某一年的数据引用可能出现了问题,最后发现是2020年高风险数据用错了,变成2019年的数据了,修改后就正常了。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>pie</title>
  8.     <!--引入链接-->
  9.     <script src="echarts.js"></script>
  10.     <script src="jquery.js"></script>
  11.     <script src="jquery.table2excel.js"></script>
  12. </head>
  13. <body>
  14.     <!--每个div单独占据一行,如果想要显示多个统计图,可以创建多个div-->
  15.     <div id="main" style="height: 400px;width: 1024px;"></div>
  16.     <div id="main2" style="height: 400px;width: 1024px;"></div>
  17.     <script type="text/javascript">
  18.         <?php
  19.             //添加公共文件
  20.             include_once 'mysql_public.php';
  21.             //获取所有风险记录
  22.             $sql_risk = "SELECT * FROM `trisk_list`";
  23.             //获取结果集
  24.             $res_risk = myerror($sql_risk);
  25.             //获取结果集数据条数:多少行记录
  26.             $rows_risk = mysqli_num_rows($res_risk);
  27.             //利用while获取,每次取到数据之后判断保存数据的结果,只要结果不为false,那么一直取
  28.             while($row_risk = mysqli_fetch_assoc($res_risk))
  29.             {
  30.                 //获取风险统计数组
  31.                 $risks[] = $row_risk;
  32.             }
  33.             //echo '<pre>';
  34.             //建立一个循环,修改每个风险记录的时间,只保留年份。
  35.             for($index = 0; $index < $rows_risk; $index++)
  36.             {
  37.                 //对日期部分进行分割,分割后返回的datetime为一个数组。
  38.                 $dateTime = explode('-',$risks[$index]['Record_time']);
  39.                 //令风险记录时间只保留年份
  40.                 $risks[$index]['Record_time'] = $dateTime[0];
  41.             }
  42.             //输出修改后的风险记录
  43.             //var_dump($risks);

  44.             //设计一个变量来接受各个年份的数据
  45.             $RiskNum = array(
  46.                 '2019'=>array(
  47.                     '高风险'=>0,
  48.                     '中风险'=>0,
  49.                     '低风险'=>0
  50.                 ),
  51.                 '2020'=>array(
  52.                     '高风险'=>0,
  53.                     '中风险'=>0,
  54.                     '低风险'=>0
  55.                 ),
  56.                 '2021'=>array(
  57.                     '高风险'=>0,
  58.                     '中风险'=>0,
  59.                     '低风险'=>0
  60.                 )
  61.             );
  62.             //记录不同年份的各个风险类型的数量。
  63.             for($index = 0; $index < $rows_risk; $index++)
  64.             {
  65.                 if((int)($risks[$index]['Record_time']) == 2019)
  66.                 {
  67.                     if((int)($risks[$index]['Risk_type']) == 1)
  68.                     {
  69.                         $RiskNum['2019']['高风险']++;
  70.                     }
  71.                     else if((int)($risks[$index]['Risk_type']) == 2)
  72.                     {
  73.                         $RiskNum['2019']['中风险']++;
  74.                     }
  75.                     else if((int)($risks[$index]['Risk_type']) == 3)
  76.                     {
  77.                         $RiskNum['2019']['低风险']++;
  78.                     }
  79.                 }
  80.                 else if((int)($risks[$index]['Record_time']) == 2020)
  81.                 {
  82.                     if((int)($risks[$index]['Risk_type']) == 1)
  83.                     {
  84.                         $RiskNum['2020']['高风险']++;
  85.                     }
  86.                     else if((int)($risks[$index]['Risk_type']) == 2)
  87.                     {
  88.                         $RiskNum['2020']['中风险']++;
  89.                     }
  90.                     else if((int)($risks[$index]['Risk_type']) == 3)
  91.                     {
  92.                         $RiskNum['2020']['低风险']++;
  93.                     }
  94.                 }
  95.                 else if((int)($risks[$index]['Record_time']) == 2021)
  96.                 {
  97.                     if((int)($risks[$index]['Risk_type']) == 1)
  98.                     {
  99.                         $RiskNum['2021']['高风险']++;
  100.                     }
  101.                     else if((int)($risks[$index]['Risk_type']) == 2)
  102.                     {
  103.                         $RiskNum['2021']['中风险']++;
  104.                     }
  105.                     else if((int)($risks[$index]['Risk_type']) == 3)
  106.                     {
  107.                         $RiskNum['2021']['低风险']++;
  108.                     }
  109.                 }
  110.             }

  111.             //输出风险数量数组
  112.             //var_dump($RiskNum);

  113.             //将php数组转为json格式
  114.             $RiskNum_json = json_encode($RiskNum);
  115.         ?>
  116.         //引用该js文件后,该js文件需要获取外部数据
  117.         var RiskNum_json = <?=$RiskNum_json?>;
  118.         var RiskNum = eval(RiskNum_json);
  119.         //color为此系列自己的调色盘
  120.         //radius:饼图的半径,外半径为可视区尺寸(容器高宽中较小一项)的 55% 长度。
  121.         //数据库传递过来的数据项是一个二维数组,如何处理?
  122.         //解:将数组传递给data即可
  123.         //value_1,表示高风险总数。以此类推。
  124.         var value_1 = RiskNum['2019']['高风险']+RiskNum['2020']['高风险']+RiskNum['2021']['高风险'];
  125.         var value_2 = RiskNum['2019']['中风险']+RiskNum['2020']['中风险']+RiskNum['2021']['中风险'];
  126.         var value_3 = RiskNum['2019']['低风险']+RiskNum['2020']['低风险']+RiskNum['2021']['低风险'];
  127.         var value_2019 = RiskNum['2019']['高风险']+RiskNum['2019']['中风险']+RiskNum['2019']['低风险'];
  128.         var value_2020 = RiskNum['2020']['高风险']+RiskNum['2020']['中风险']+RiskNum['2020']['低风险'];
  129.         var value_2021 = RiskNum['2021']['高风险']+RiskNum['2021']['中风险']+RiskNum['2021']['低风险'];
  130.         var RiskData = [
  131.             {value:value_1,name:"较大风险"},
  132.             {value:value_2,name:"中风险"},
  133.             {value:value_3,name:"低风险"},
  134.         ];
  135.         var RiskData2 = [
  136.             {value:value_2019,name:"2019年风险数量"},
  137.             {value:value_2020,name:"2020年风险数量"},
  138.             {value:value_2021,name:"2021年风险数量"},
  139.         ];

  140.         //定位:如果使用center/middle等位置描述,需写成字符串格式,百分比也这么写:radius:'55%'。如果写绝对值,那么以number形式书写,单位是像数值(单位不用写)
  141.         var myChart = echarts.init(document.getElementById("main"));
  142.         var option = {
  143.             title: [{
  144.                 text: '风险统计图',
  145.                 left: "center"
  146.             },{
  147.                 subtext: "风险类型占比",
  148.                 left: "18%",
  149.                 top: "75%",
  150.                 textAline:'center'
  151.             },{
  152.                 subtext: "年度风险总量",
  153.                 left: "74%",
  154.                 top: "75%",
  155.                 textAline:'center'
  156.             }],
  157.             tooltip: {   
  158.                 trigger: 'item',
  159.                 //饼图: a:系列名,b:数据名,c:数值,d:百分比。
  160.                 //formatter,提示框浮层内容格式器,支持字符串模板和回调函数两种形式。
  161.                 formatter: '{a} <br/>{b} : {c} ({d}%)'
  162.             },
  163.             toolbox:{
  164.                 show: true,
  165.                 feature: {
  166.                     mark: {show: true},
  167.                     dataView: {
  168.                         show: true,
  169.                         readOnly: false,
  170.                         lang: ['数据视图', '关闭', '导出Excel'],    // 按钮
  171.                         contentToOption: function (opts) {
  172.                             $("#tableExcel_Day").table2excel({           // 下载jquery.table2excel.js,引入,$("#tempChart")是table的id
  173.                                 exclude: ".noExl", //过滤位置的 css 类名, 有class = “noExl” 的行不被导出
  174.                                 filename: '风险统计图' + ".xls", // 文件名称
  175.                                 name: "Excel Document Name.xls",
  176.                                 exclude_img: true,
  177.                                 exclude_links: true,
  178.                                 exclude_inputs: true
  179.                             });
  180.                         },
  181.                         optionToContent:function(option){
  182.                             var legend = option.legend;
  183.                             var series = option.series; //坐标数据
  184.                             var tdHeads = ''; //表头第一列
  185.                             var tdBodys = ''; //表数据
  186.                             //组装表头
  187.                             var nameData = new Array('较大风险','中风险','低风险','2019年风险数量','2020年风险数量','2021年风险数量');
  188.                             for (var i = 0; i < nameData.length; i++) {
  189.                                 tdHeads += '<td style="padding: 0 10px">' + nameData[i] + '</td>';
  190.                             }
  191.                             var table = '<table id="tableExcel_Day" border="1" class="table-bordered table-striped" style="width:100%;text-align:center" ><tbody><tr>' + tdHeads + '</tr>';
  192.                             //组装表数据
  193.                             for (var i = 0; i < 2;  i++) {
  194.                                 for (var j = 0; j < 3 ; j++) {                          
  195.                                     var temp = series[i].data[j]['value'];
  196.                                     if (temp != null && temp != undefined) {                                    
  197.                                         tdBodys += '<td>' + temp + '</td>';      
  198.                                     } else {
  199.                                         tdBodys += '<td></td>';
  200.                                     }
  201.                                 }
  202.                                 // table += '<tr>' + tdBodys + '</tr>';
  203.                                 // tdBodys = '';
  204.                             }
  205.                             table += '<tr>' + tdBodys + '</tr>';
  206.                             table += '</tbody></table>';
  207.                             return table;
  208.                         }
  209.                     },
  210.                     restore: {show: true},
  211.                     saveAsImage: {show: true}
  212.                 }
  213.             },
  214.             legend: {
  215.                 data:['较大风险','中风险','低风险','2019年风险数量','2020年风险数量','2021年风险数量'],
  216.                 top:'10%',
  217.             },
  218.             series:[{
  219.                 name: "风险类型占比",
  220.                 color:['red','orange','blue'],
  221.                 type: "pie",
  222.                 radius: '35%',
  223.                 center:['50%','50%'],
  224.                 data: RiskData,
  225.                 right:'55%',
  226.                 left:0,
  227.                 top:0,
  228.                 buttom:0
  229.             },{
  230.                 name: "年度风险总量",
  231.                 color:['red','orange','pink'],
  232.                 type: "pie",
  233.                 radius: '35%',
  234.                 data: RiskData2,
  235.                 left:'55%',
  236.                 right:0,
  237.                 top:0,
  238.                 buttom:0
  239.             }]
  240.         };
  241.         myChart.setOption(option);
  242.         // 处理点击事件并且弹出数据名称
  243.         myChart.on('click', function (params) {
  244.             alert(params.name);
  245.         });
  246.     </script>
  247.     <script type="text/javascript">
  248.         <?php
  249.             //添加公共文件
  250.             include_once 'mysql_public.php';
  251.             //获取所有风险记录
  252.             $sql_risk = "SELECT * FROM `trisk_list`";
  253.             //获取结果集
  254.             $res_risk = myerror($sql_risk);
  255.             //获取结果集数据条数:多少行记录
  256.             $rows_risk = mysqli_num_rows($res_risk);
  257.             //利用while获取,每次取到数据之后判断保存数据的结果,只要结果不为false,那么一直取
  258.             while($row_risk = mysqli_fetch_assoc($res_risk))
  259.             {
  260.                 //获取风险统计数组
  261.                 $risks[] = $row_risk;
  262.             }
  263.             //echo '<pre>';
  264.             //建立一个循环,修改每个风险记录的时间,只保留年份。
  265.             for($index = 0; $index < $rows_risk; $index++)
  266.             {
  267.                 //对日期部分进行分割,分割后返回的datetime为一个数组。
  268.                 $dateTime = explode('-',$risks[$index]['Record_time']);
  269.                 //令风险记录时间只保留年份
  270.                 $risks[$index]['Record_time'] = $dateTime[0];
  271.             }
  272.             //输出修改后的风险记录
  273.             //var_dump($risks);

  274.             //设计一个变量来接受各个年份的数据
  275.             $RiskNum = array(
  276.                 '2019'=>array(
  277.                     '高风险'=>0,
  278.                     '中风险'=>0,
  279.                     '低风险'=>0
  280.                 ),
  281.                 '2020'=>array(
  282.                     '高风险'=>0,
  283.                     '中风险'=>0,
  284.                     '低风险'=>0
  285.                 ),
  286.                 '2021'=>array(
  287.                     '高风险'=>0,
  288.                     '中风险'=>0,
  289.                     '低风险'=>0
  290.                 )
  291.             );
  292.             //记录不同年份的各个风险类型的数量。
  293.             for($index = 0; $index < $rows_risk; $index++)
  294.             {
  295.                 if((int)($risks[$index]['Record_time']) == 2019)
  296.                 {
  297.                     if((int)($risks[$index]['Risk_type']) == 1)
  298.                     {
  299.                         $RiskNum['2019']['高风险']++;
  300.                     }
  301.                     else if((int)($risks[$index]['Risk_type']) == 2)
  302.                     {
  303.                         $RiskNum['2019']['中风险']++;
  304.                     }
  305.                     else if((int)($risks[$index]['Risk_type']) == 3)
  306.                     {
  307.                         $RiskNum['2019']['低风险']++;
  308.                     }
  309.                 }
  310.                 else if((int)($risks[$index]['Record_time']) == 2020)
  311.                 {
  312.                     if((int)($risks[$index]['Risk_type']) == 1)
  313.                     {
  314.                         $RiskNum['2020']['高风险']++;
  315.                     }
  316.                     else if((int)($risks[$index]['Risk_type']) == 2)
  317.                     {
  318.                         $RiskNum['2020']['中风险']++;
  319.                     }
  320.                     else if((int)($risks[$index]['Risk_type']) == 3)
  321.                     {
  322.                         $RiskNum['2020']['低风险']++;
  323.                     }
  324.                 }
  325.                 else if((int)($risks[$index]['Record_time']) == 2021)
  326.                 {
  327.                     if((int)($risks[$index]['Risk_type']) == 1)
  328.                     {
  329.                         $RiskNum['2021']['高风险']++;
  330.                     }
  331.                     else if((int)($risks[$index]['Risk_type']) == 2)
  332.                     {
  333.                         $RiskNum['2021']['中风险']++;
  334.                     }
  335.                     else if((int)($risks[$index]['Risk_type']) == 3)
  336.                     {
  337.                         $RiskNum['2021']['低风险']++;
  338.                     }
  339.                 }
  340.             }

  341.             //输出风险数量数组
  342.             //var_dump($RiskNum);

  343.             //将php数组转为json格式
  344.             $RiskNum_json = json_encode($RiskNum);
  345.         ?>
  346.         //引用该js文件后,该js文件需要获取外部数据
  347.         var RiskNum_json = <?=$RiskNum_json?>;
  348.         var RiskNum = eval(RiskNum_json);
  349.         //输出2019年高风险数据,测试传输成功与否
  350.         //alert(RiskNum['2019']['高风险']);
  351.         //legend:图例组件展现了不同系列的标记(symbol),颜色和名字。可以通过点击图例控制哪些系列不显示。
  352.         //legend,会在统计图顶部显示不同颜色的按钮。
  353.         var myChart = echarts.init(document.getElementById('main2'));
  354.         var option = {
  355.             title:{text:"年度风险数量对比直方图",left:"center"},
  356.             legend: {
  357.                 top:"7%",
  358.                 data:['高风险','中风险','低风险']
  359.             },
  360.             toolbox: {
  361.                 show :true,
  362.                 feature: {
  363.                     dataView:{
  364.                         show:true,
  365.                         title:'数据视图',
  366.                         lang: ['数据视图', '关闭', '导出Excel'],    // 按钮
  367.                         contentToOption: function (opts) {
  368.                             $("#tableExcel_Day").table2excel({           // 下载jquery.table2excel.js,引入,$("#tempChart")是table的id
  369.                                 exclude: ".noExl", //过滤位置的 css 类名, 有class = “noExl” 的行不被导出
  370.                                 filename: '风险统计图' + ".xls", // 文件名称
  371.                                 name: "Excel Document Name.xls",
  372.                                 exclude_img: true,
  373.                                 exclude_links: true,
  374.                                 exclude_inputs: true
  375.                             });
  376.                         },
  377.                         optionToContent:function(option){
  378.                         var dataset = option.dataset;
  379.                         var axisData = option.xAxis[0].data; //坐标数据
  380.                         var tdHeads = '<td  style="padding: 0 10px">时间</td>'; //表头第一列
  381.                         var tdBodys = ''; //表数据
  382.                         //组装表头
  383.                         var nameData = new Array("高风险","中风险","低风险");
  384.                         for (var i = 0; i < nameData.length; i++) {
  385.                             tdHeads += '<td style="padding: 0 10px">' + nameData[i] + '</td>';
  386.                         }
  387.                         var table = '<table id="tableExcel_Day" border="1" class="table-bordered table-striped" style="width:100%;text-align:center" ><tbody><tr>' + tdHeads + '</tr>';
  388.                         //组装表数据
  389.                         for (var i = 1; i < 4;  i++) {
  390.                             for (var j = 1; j < 4 ; j++) {                          
  391.                                 var temp = dataset[0].source[i][j];
  392.                                 if (temp != null && temp != undefined) {                                    
  393.                                     tdBodys += '<td>' + temp + '</td>';      
  394.                                 } else {
  395.                                     tdBodys += '<td></td>';
  396.                                 }
  397.                             }
  398.                             table += '<tr><td style="padding: 0 10px">' + axisData[i-1] + '</td>' + tdBodys + '</tr>';
  399.                             tdBodys = '';
  400.                         }
  401.                         table += '</tbody></table>';
  402.                         return table;
  403.                     }},
  404.                     restore:{show:true},
  405.                     magicType:{type:['bar','line']},
  406.                     saveAsImage:{show:true}
  407.                 }
  408.             },
  409.             tooltip: {
  410.             },
  411.             xAxis:{
  412.                 type:'category',
  413.                 data: ['2019','2020','2021']   
  414.             },
  415.             yAxis:{
  416.                 type:'value'
  417.             },
  418.             dataset:{
  419.                 source:[
  420.                     ['year','高风险','中风险','低风险'],
  421.                     ['2019',RiskNum['2019']['高风险'],RiskNum['2019']['中风险'],RiskNum['2019']['低风险']],
  422.                     ['2020',RiskNum['2020']['高风险'],RiskNum['2020']['中风险'],RiskNum['2020']['低风险']],
  423.                     ['2021',RiskNum['2021']['高风险'],RiskNum['2021']['中风险'],RiskNum['2021']['低风险']],
  424.                 ]
  425.             },
  426.             series: [
  427.                 {
  428.                     //name: '高风险',
  429.                     type: 'bar',
  430.                     // 根据stack的值来选取那些柱子堆叠在一起
  431.                     stack: '风险等级',
  432.                     color: 'red',
  433.                     emphasis: {
  434.                         focus: 'series'
  435.                     },
  436.                     //data: [320, 332, 301],
  437.                     barWidth: '25%'
  438.                 },
  439.                 {
  440.                     //name: '中风险',
  441.                     type: 'bar',
  442.                     stack: '风险等级',
  443.                     color: 'orange',
  444.                     emphasis: {
  445.                         focus: 'series'
  446.                     },
  447.                     //data: [120, 132, 101],
  448.                     barWidth: '25%'
  449.                 },
  450.                 {
  451.                     //name: '低风险',
  452.                     type: 'bar',
  453.                     stack: '风险等级',
  454.                     color: 'blue',
  455.                     emphasis: {
  456.                         focus: 'series'
  457.                     },
  458.                     //data: [220, 182, 191],
  459.                     barWidth: '25%'
  460.                 }
  461.             ]
  462.         };
  463.         //把配置项给实例对象
  464.         myChart.setOption(option);
  465.     </script>
  466. </body>
  467. </html>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 15:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表