echarts:导入excel生成桑葚图

前言

前两天帮别人实现了一个小功能,主要是选择excel文件,读取里面的数据,将数据生成桑葚图

echarts官方桑葚图案例

实现

因为就是一个单纯的html文件,用到的库都是通过CDN的方式加载的,会有一些慢

java 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #main {
            width: 800px;
            height: 600px;
            border: 1px solid red;
        }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.5.1/dist/echarts.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.17.5/xlsx.full.min.js"></script>
</head>

<body>
    <input type="file" id="excelFileInput" />
    <div id="main"></div>

    <script type="text/javascript">


        // 解析excel
        document.getElementById('excelFileInput').addEventListener('change', function (event) {
            const file = event.target.files[0];
            const dom = document.getElementById('main')
            var myChart = echarts.init(dom);
            console.log("加载:", window.echarts, dom)
            if (file) {
                const reader = new FileReader();
                reader.onload = function (e) {
                    const data = new Uint8Array(e.target.result);
                    const workbook = XLSX.read(data, { type: 'array' });

                    // 假设我们要解析第一个工作表
                    const firstSheetName = workbook.SheetNames[0];
                    const worksheet = workbook.Sheets[firstSheetName];

                    // 将工作表转换为JSON
                    const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });

                    console.log("json数据:", jsonData, jsonData.length)

                    // 自己的数据
                    const excelData = {
                        // 节点
                        nodes: [],
                        links: []
                    }

                    // 循环生成数据
                    for (let i = 1; i < jsonData.length; i++) {
                        // 生成节点,避免添加重复数据
                        if (!excelData.nodes.find(e => e.name == jsonData[i][0])) {
                            excelData.nodes.push({
                                name: jsonData[i][0]
                            })
                        }
                        if (!excelData.nodes.find(e => e.name == jsonData[i][1])) {
                            excelData.nodes.push({
                                name: jsonData[i][1]
                            })
                        }
                        // 生成线段
                        if (!excelData.nodes.find(e => e.source == jsonData[i][0] && e.target == jsonData[i][1])) {
                            excelData.links.push({
                                source: jsonData[i][0],
                                target: jsonData[i][1],
                                value: jsonData[i][2]
                            })
                        }

                    }
                    console.log("数据:", excelData)

                    // 指定图表的配置项和数据
                    var option = {
                        title: {
                            text: '桑基图',
                            left: 'center'
                        },
                        // 触发方式
                        tooltip: {
                            trigger: 'item',
                            triggerOn: 'mousemove'
                        },
                        series: [
                            {
                                // 图表类型
                                type: 'sankey',
                                // 节点
                                data: excelData.nodes,
                                // 线条
                                links: excelData.links,
                                emphasis: {
                                    focus: 'adjacency'
                                },
                                // 线的类型
                                lineStyle: {
                                    color: 'gradient',
                                    curveness: 0.5
                                }
                            }
                        ]
                    };

                    // 使用刚指定的配置项和数据显示图表。
                    myChart.setOption(option);
                };

                reader.readAsArrayBuffer(file);
            }
        });


    </script>
</body>

</html>

excel文件格式

效果图

相关推荐
无人生还15 分钟前
从 Vue3 到 React · 快速上手系列第 11 篇:状态管理
前端·vue.js·react.js
GuWenyue16 分钟前
90%前端写React TS都踩坑!一套父子组件+Hooks完整实战,彻底搞懂类型约束
前端·react.js
Hilaku26 分钟前
当 AI 一天写完一周的代码,我们还剩什么优势?
前端·javascript·程序员
尘世中一位迷途小书童30 分钟前
无人机航线里的云台角度怎么调?Cesium 做了个视锥 + 鹰眼联动
前端·javascript·数据可视化
思码梁田34 分钟前
CSS display 属性:从元素类型转换到隐藏元素的实用指南
前端·css·display·inline·block·none·inline-block
Csvn35 分钟前
⚡ Vite 依赖预构建(optimizeDeps)的 3 个经典坑:改了源码不生效、新增依赖 404、缓存怎么清都不行
前端
A24207349301 小时前
Vue3 + TypeScript:后端数据在表格内渲染后进行增删改的完整实现步骤
前端·javascript·typescript
他们叫我 悦儿遥遥雨1 小时前
.NET 8 Web开发入门(六):Blazor 全栈开发——告别 JavaScript 焦虑
前端·javascript·.net
用户2181697049301 小时前
Flutter(九)StatelessWidget StatefullWidget
前端
paopaokaka_luck1 小时前
基于springboot3+vue3的乡村医生诊疗管理系统(AI助手、协同过滤算法、webSocket实时聊天、Echarts图形化分析)
前端·网络·人工智能·spring boot·websocket·网络协议·echarts