ECharts与Excel的火花

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、ECharts:现代数据可视化的利器

二、Excel:经典的数据处理与分析工具

三、ECharts与Excel的结合:火花碰撞

3.1 柱状图前端代码

3.2 饼图前端代码

3.3 后端通用代码

3.3.1 生成Excel表格

3.3.2 Excel表格数据导入ECharts

四、总结


前言

在数据爆炸的时代,如何有效地呈现和解析数据变得至关重要。

ECharts和Excel作为两种广泛使用的数据处理和可视化工具,各自拥有其独特的魅力和功能。

本文将深入探讨这两者之间的火花碰撞,以及如何结合它们以实现更强大的数据可视化效果。


一、ECharts:现代数据可视化的利器

ECharts是一款开源的数据可视化库,提供丰富的图表类型和高度定制化的选项。

ECharts支持折线图、柱状图、散点图、饼图等多种图表类型,并且可以根据需要轻松定制颜色、标签、提示框等视觉元素。

此外,ECharts还支持动态数据更新和高性能渲染,使其成为现代数据可视化的理想选择。


二、Excel:经典的数据处理与分析工具

Excel作为微软办公套件的核心组件,已经成为全球范围内广泛使用的数据处理和分析工具。

通过Excel,用户可以进行数据的排序、筛选、函数计算和可视化等多种操作。

Excel提供了丰富的图表类型和数据分析工具,使得用户能够轻松地进行数据处理和可视化工作。


三、ECharts与Excel的结合:火花碰撞

尽管ECharts和Excel都是强大的数据处理和可视化工具,但它们各有优缺点。将两者结合起来,可以取长补短,实现更强大的数据可视化效果。以下是一些结合ECharts和Excel的方法:

  1. 数据导入与处理:使用Excel进行数据清洗和处理,然后将处理后的数据导入ECharts进行可视化。这样可以充分发挥Excel在数据处理方面的优势,同时利用ECharts丰富的图表类型进行可视化。
  2. 动态数据更新:在Excel中创建图表后,可以利用ECharts的动态数据更新功能,实时将最新数据传递给图表。这样可以实现数据的动态展示,使得图表更加生动和具有实时性。
  3. 交互式数据探索:结合ECharts的交互式特性,可以在Excel中实现交互式的数据探索和分析。用户可以通过点击、拖拽等方式在图表上进行操作,获取更多关于数据的洞察。
  4. 自定义图表类型:ECharts支持高度定制化的图表类型,而Excel也提供了丰富的图表模板。通过结合两者,可以创建出既满足个性化需求又具有专业视觉效果的图表。
  5. 数据驱动的故事叙述:利用ECharts和Excel的组合,可以创建数据驱动的故事叙述。通过精心设计的图表和数据分析,将数据背后的故事生动地呈现给观众。

接下来通过两个例子给大家演示具体的实现!

3.1 柱状图前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>echarts-bar</title>
    <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
    <script src="js/echarts.min.js"></script>
    <script src="../../plugins/element-ui/index.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width:2000px; height:700px;"></div>

<button onclick="generateExcel()">导出Excel文件</button>
<script type="text/javascript">
    function generateExcel() {
        fetch('http://localhost:8080/backend/page/eChart/excel')
            .then(response => response.json())
            .then(data => {
                const url = window.URL.createObjectURL(new Blob([data]));
                const a = document.createElement('a');
                a.href = url;
                a.download = '菜品销量.xlsx'; // 你可以根据需要设置文件名
                a.click();
            });
    }
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));

    // 指定图表的配置项和数据
    myChart.setOption({
        title: {
            text: '菜品销售情况柱形图'
        },
        tooltip: {},
        legend: {
            data: ['销量']
        },
        xAxis: {
            data: [],
            axisLabel: {
                interval: 0
            }
        },
        yAxis: {},
        series: [{
            name: '销量',
            type: 'bar',
            data: [],
            itemStyle: {
                color: '#91cc75',
                shadowColor: '#91cc75',
                borderType: 'dashed',
                opacity: 0.5,
                borderWidth:1
            },
        }]
    });

    myChart.showLoading();

    var names = [];    //类别数组(实际用来盛放X轴坐标值)
    var nums = [];    //销量数组(实际用来盛放Y坐标值)

    $.ajax({
        type: "get",
        async: false,            //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
        url: "list",    //请求发送到TestServlet处
        data: {},
        dataType: "json",        //返回数据形式为json
        success: function (result) {
            //请求成功时执行该函数内容,result即为服务器返回的json对象
            var data = result.data;
            console.log(data);
            if (data) {
                for (var i = 0; i < data.length; i++) {
                    names.push(data[i].name);    //挨个取出类别并填入类别数组
                }
                for (var i = 0; i < data.length; i++) {
                    nums.push(data[i].count);    //挨个取出销量并填入销量数组
                }
                myChart.hideLoading();    //隐藏加载动画
                myChart.setOption({        //加载数据图表
                    xAxis: {
                        data: names
                    },
                    series: [{
                        // 根据名字对应到相应的系列
                        name: '销量',
                        data: nums
                    }]
                });

            }
        },
        error: function () {
            //请求失败时执行该函数
            alert("图表请求数据失败!");
            myChart.hideLoading();
        }
    })
</script>
</body>
</html>

3.2 饼图前端代码

<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" style="height: 100%">
<head>
  <meta charset="utf-8">
  <title>echarts-pie</title>
  <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
  <script src="js/echarts.min.js"></script>
</head>
<body style="height: 100%; margin: 0">
<div id="main" style="height: 100%"></div>
<button onclick="generateExcel()">导出Excel文件</button>

<script type="text/javascript">
  function generateExcel() {
    fetch('http://localhost:8080/backend/page/eChart/excel')
            .then(response => response.json())
            .then(data => {
              const url = window.URL.createObjectURL(new Blob([data]));
              const a = document.createElement('a');
              a.href = url;
              a.download = '菜品销量.xlsx'; // 你可以根据需要设置文件名
              a.click();
            });
  }
  var mychart1 = echarts.init(document.getElementById('main'));

  mychart1.setOption({
    title: {
      text: '菜品销量统计饼状图',
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    legend: {
      orient: 'vertical',
      left: 'left'
    },
    series: [
      {
        name: 'Access From',
        type: 'pie',
        radius: '50%',
        data: []
      }],
    emphasis: {
      itemStyle: {
        shadowBlur: 10,
        shadowOffsetX: 0,
        shadowColor: 'rgba(0, 0, 0, 0.5)'
      }
    }
  });

  mychart1.showLoading();

  var names=[];
  var nums=[];

  $.ajax({
    type : "get",
    async : false,            //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
    url : "list",    //请求发送到TestServlet处
    data : {},
    dataType : "json",        //返回数据形式为json
    success : function(result) {
      //请求成功时执行该函数内容,result即为服务器返回的json对象
      var data = result.data;
      if (data) {
        for(var i=0;i<data.length;i++){
          names.push(data[i].name);    //挨个取出类别并填入类别数组
          nums[i] = {value: data[i].count,name:data[i].name};
        }
        /*          for(var i=0;i<data.length;i++){
                    nums.push(data[i].count);    //挨个取出销量并填入销量数组
                  }*/
        mychart1.hideLoading();    //隐藏加载动画
        mychart1.setOption({        //加载数据图表
          series: {
            type: 'pie',
            radius: '55%',
            center: ['50%','60%'],
            data: nums,
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgb(0,0,0,0.5)'
              }
            }
          },
        });
      }
    },
    error : function() {
      //请求失败时执行该函数
      alert("图表请求数据失败!");
      mychart1.hideLoading();
    }
  })

  window.addEventListener('resize', mychart1.resize);
</script>
</body>
</html>

3.3 后端通用代码

3.3.1 生成Excel表格

 @RequestMapping(value = "excel", method = RequestMethod.GET)
    public R<String> getExcel(){
        File file = new File(path);
        
        QueryWrapper<Dish> wrapper = new QueryWrapper<>();
        wrapper.select("name", "count");
        List<Dish> list = dishService.list(wrapper);
        ArrayList<Map<String, Object>> rows = new ArrayList<>();
        for (Dish dish : list) {
            Map<String, Object> row = new LinkedHashMap<>();
            row.put("菜品", dish.getName());
            row.put("销量", dish.getCount());
            rows.add(row);
        }

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(path);
        // 合并单元格后的标题行,使用默认标题样式
        writer.merge(1 ,"菜品销量统计");
        // 一次性写出内容,使用默认样式,强制输出标题
        writer.write(rows,true);
        // 关闭writer,释放内存
        writer.close();
        r.setCode(1);
        r.setData("文件导出成功");
        return r;
    }

3.3.2 Excel表格数据导入ECharts

        public static final String path = "D:\\java\\excel\\test.xlsx"; 
       
        File file = new File(path);

        FileInputStream input = new FileInputStream(file);

        MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input));
        // 1.获取上传文件输入流
        InputStream inputStream = null;

        inputStream = multipartFile.getInputStream();

        // 2.应用HUtool ExcelUtil获取ExcelReader指定输入流和sheet
        ExcelReader excelReader = ExcelUtil.getReader(inputStream, "sheet1");
        // 可以加上表头验证
        // 3.读取第二行到最后一行数据
        //List<List<Object>> read = excelReader.read(1, excelReader.getRowCount());
        return excelReader.readAll();

四、总结

ECharts与Excel的结合,不仅可以充分发挥两者的优势,还可以实现更强大的数据可视化效果。

无论是从数据处理、图表创建还是故事叙述的角度,这种结合都能为数据分析师、业务人员和决策者提供更丰富、更直观的数据洞察。

在这个充满数据的世界里,让我们一起点燃ECharts与Excel的火花碰撞,探索无限可能的数据可视化之旅!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux软件包管理器——yum命令

如何使用yum 一、快速认识yum(简单介绍)二、快速使用yum2.1 rzsz2.2 linux命令行小游戏和彩蛋 三、yum的整个生态问题 一、快速认识yum(简单介绍) Linux中我们也要进行工具/指令/程序&#xff0c;安装&#xff0c;检查卸载等&#xff0c;需要yum的软件 安装软件的方式&#xf…

视频合并软件,重塑你的创意世界

在数字化的世界里&#xff0c;视频已经成为了我们表达自我、传递信息的重要方式。而合并视频&#xff0c;更是将这种表达推向了一个新的高度。通过简单的操作&#xff0c;我们不仅能够将不同的视频完美地融合在一起&#xff0c;更能赋予它们全新的含义。 所需工具&#xff1a;…

HarmonyOS4.0系统性深入开发11通过message事件刷新卡片内容

通过message事件刷新卡片内容 在卡片页面中可以通过postCardAction接口触发message事件拉起FormExtensionAbility&#xff0c;然后由FormExtensionAbility刷新卡片内容&#xff0c;下面是这种刷新方式的简单示例。 在卡片页面通过注册Button的onClick点击事件回调&#xff0c;…

ShuffleNet V2:高效CNN架构设计实用指南

摘要 目前&#xff0c;神经网络架构设计主要以计算复杂度的间接指标&#xff08;即 FLOPs&#xff09;为指导。然而&#xff0c;直接指标&#xff08;如速度&#xff09;还取决于其他因素&#xff0c;如内存访问成本和平台特性。因此&#xff0c;这项工作建议在目标平台上评估…

C语言之sizeof详解,5点透析,帮你真正了解它

今天也要继续坚持 前言 今天复习C语言了解到不少和她有关的知识&#xff0c;才知道之前对他了解甚少&#xff0c;于是写下博客及时记录自己的所得&#xff0c;与大家分享一下 第一点&#xff1a;sizeof不是函数 sizeof是一个关键字而不是函数&#xff01;是的&#xff0c;他…

一起学量化之KDJ指标

KDJ指标,也称为随机指数,是一个常用的技术分析工具。它由三条线组成:K线、D线和J线,分别代表不同的市场动态。KDJ指标通过分析最高价、最低价和收盘价计算得出。 1. KDJ指标理解 J线是移动速度最快的线,可以提供更加敏锐的市场信号。K线是指标的核心,显示市场的即时动态。…

ubuntu22.04安装anacoda遇到的坑

这几天把用了3年的windows10换成了ubuntu22.04 各种环境都得配置&#xff0c;本文记录下遇到的坑。 1、anacoda在ubuntu上也可以用官方也提供了安装包&#xff0c;但是没有图形界面&#xff0c;需要以命令行的方式安装和运行配置 1.1 安装&#xff1a;官网下载后&#xff0c;…

C++ 递归函数 详细解析——C++日常学习随笔

1. 递归函数 1.1 递归函数的定义 递归函数&#xff1a;即在函数体中出现调用自身的函数&#xff0c;即函数Func(Type a,……)直接或间接调用函数本身&#xff1b; 递归函数&#xff1a;在数学上&#xff0c;关于递归函数的定义如下&#xff1a;对于某一函数f(x)&#xff0c;其…

探秘HyperLogLog:Redis中的基数统计黑科技

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘HyperLogLog&#xff1a;Redis中的基数统计黑科技 前言HyperLogLog简介基数和基数统计的重要性HyperLogLog的历史和革命性 HyperLogLog的工作原理哈希函数线性计数与对数计数HyperLogLog的核心算法…

[情商-2]:理解情商最关注的要素 - 情绪,情绪,情绪,不是事情本身,不是逻辑推理,不是讲道理

前言&#xff1a; 情商最关注的要素是情绪&#xff0c;他人的情形&#xff0c;自己的情绪&#xff0c;情绪是一个完全不同于技术人员经常关注的逻辑推理、问题解决。对于技术人员而言&#xff0c;它是一个完全不同的领域&#xff0c;有着不同的行为模式。 因此&#xff0c;在…

Android端SpyNote恶意软件技术层面深度剖析

内容概述&#xff1a; 当前的Android生态环境中充斥着各种类型的恶意软件&#xff0c;每一款恶意软件都有其自己独特的一面。在大多数情况下&#xff0c;它们的目标都是窃取用户数据&#xff0c;然后将其出售以换取金钱。但某些恶意软件则可以被归类为间谍软件&#xff0c;因为…

【操作系统】 文件管理

文件管理概述 文件管理的对象&#xff1a;计算机中的程序和数据。 文件管理的主要任务&#xff1a;利用文件系统把所管理的程序和数据组织成一系列文件&#xff0c;并把文件的存取、共享和保护手段提供给用户。 文件管理的主要功能包括&#xff1a;外存的分配 目录管理 存储…

论文阅读——SG-Former

SG-Former: Self-guided Transformer with Evolving Token Reallocation 1. Introduction 方法的核心是利用显著性图&#xff0c;根据每个区域的显著性重新分配tokens。显著性图是通过混合规模的自我关注来估计的&#xff0c;并在训练过程中自我进化。直观地说&#xff0c;我们…

【已解决】若依系统前端打包后,部署在nginx上,点击菜单错误:@/views/system/role/index

​ 上面错误&#xff0c;是因为/views/system/role/index动态路由按需加载时候&#xff0c;错误导致。 解决办法&#xff1a; 如果您的前端项目访问时候&#xff0c;需要带有项目名称的话&#xff0c;参考凯哥上一篇文章&#xff1a;【已解决】若依前后端分离版本&#xff0…

Springboot整合Elasticsearch 7.X 复杂查询

这里使用Springboot 2.7.12版本&#xff0c;Elasticsearch为7.15.0。 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency> yaml文件配置…

<软考高项备考>《论文专题 - 37 采购管理(1) 》

1 成本管理基础 1.1 写作要点 过程定义、作用写作要点、思路规划采购管理规划采购管理是记录项目采购决策、明确采购方法&#xff0c;及识别潜在卖方的过程。作用:确定是否从项目外部获取货物和服务&#xff0c;如果是&#xff0c;则还要确定将在什么时间、以什么方式获取什么…

Nginx 代理静态资源,解决跨域问题

&#x1f602; 背景&#xff1a;移动端 H5 项目&#xff0c;依赖了一个外部的 JS 文件。访问时&#xff0c;出现跨域&#xff0c;导致请求被 block。 当前域名&#xff1a;https://tmcopss.test.com要访问的 JS 文件&#xff1a;https://tm.test.com/public/scripts/y-jssdk.j…

大数据概念:数据网格和DataOps

数据网格&#xff08;Data Mesh&#xff09; 一种新型的数据架构模式&#xff0c;旨在解决传统数据架构中存在的一些问题&#xff0c;例如数据孤岛、数据冗余、数据安全等。数据网格将数据作为一种服务&#xff0c;通过在分布式环境中提供数据服务&#xff0c;实现数据的共享和…

gem5学习(8):创建一个简单的缓存对象--Creating a simple cache object

目录 一、SimpleCache SimObject 二、Implementing the SimpleCache 1、getSlavePort() 2、handleRequest() 3、AccessEvent() 4、accessTiming() &#xff08;1&#xff09;缓存命中&#xff1a;sendResponse() &#xff08;2&#xff09;缓存未命中&#xff1a; 三、…

1-Linux-基础

文章目录 Linux基础知识操作系统基础知识Linux基础知识Linux系统的组成Linux系统图示Linux发行版 Linux基础命令Linux系统的目录结构目录结构对比&#xff1a;windows路径描述方式 Linux命令入门Linux命令通用格式入门命令示例&#xff1a;ls 目录切换【命令】路径&#xff1a;…