xlsx 解析excel 后渲染到表格里(前端实现 解析excel渲染到表格)

25 篇文章 0 订阅

  需求:

解析 excel文档 并且 展示到表格里。

实现步骤:

方法一:纯前端 借用 xlsx 插件 解析后 直接渲染到 表格里。

方法二:前后端结合,前端上传文件,后端解析并返回数据,前端接收到再渲染到表格。

今天只讨论纯前端。

先 安装xlsx插件

cnpm install xlsx

然后调用 它的方法 解析文件( 使用 Element UI 提供的上传功能组件对 excel 表格数据进行解析)。

代码可参考:

Vue 前端解析 Excel 数据_不情不愿的博客-CSDN博客_vue 解析excel

今天只讨论,解析后的数据渲染成表格的方法:

因为 你解析的excel 表格 表头不确定也就是说列数不确定,甚至 表头的文字也不确定。

思路:

1.拿到解析后的数据,根据 数据生成一个 表头配置信息

  因为表头 列不确定,文字也不确定,所以要 动态生成。格式如下,key是 el-table-column 的prop属性 value是label属性。然后v-for 动态生成el-table-column。

 [{key:"xxx",value:"文字"}]

2.表头 确定好了就该 处理数据了。把数据处理成 表格可以 使用的。

下面是 最基础的表格数据。因为表格列和文字不确定。所以 数组里对象的 key值也是动态的(表头有几个,它就有几个,表头的key就是 它的key)。

 tableData: [{
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄'
          }, {
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1517 弄'
          }, {
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄'
          }, {
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1516 弄'
          }]

代码如下:

比如解析到的数据如下:

    let data = [
                    ["参会人角色", "参会人姓名", "身份证号码", "手机号码", "是否主持人"],
                    ["董事长1", "谷雨", "4xxxx", "178xxxx", "是", "信息"],
                    ["董事长2", "谷雨2", "4xxxx2", "178xxxx2", "是", "信息2"],

                ];

 第一行是表头信息,从第二行开始才是数据。所以 处理数据时要,删除第一项。

因为表头的 文字不确定 ,所以我借用了 pinyinPro 的库 获取 文字的首字母 为 key值。并且为了防止首字母一样的情况我 还给后面拼上了 它的 下标。

pinyinPro 使用 方法:

https://github.com/zh-lx/pinyin-pro -pinyinPro的GitHub地址

npm 安装

npm install pinyin-pro

浏览器 script 引入:

<!--引入某个版本,如3.5.0版本-->
<!-- <script src="https://cdn.jsdelivr.net/gh/zh-lx/pinyin-pro@3.5.0/dist/pinyin-pro.js"></script> -->
<!--引入最新版本-->
<script src="https://cdn.jsdelivr.net/gh/zh-lx/pinyin-pro@latest/dist/pinyin-pro.js"></script>
<script>
  var { pinyin } = pinyinPro;
  pinyin('汉语拼音'); // 'hàn yǔ pīn yīn'
</script>

所有代码如下: 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <style>

    </style>
</head>

<body>
    <div id="app">
        <template>
            <el-table :data="tableData" style="width: 100%">
                <el-table-column :prop="item.key" :label="item.value" width="180" v-for="item in columns">
                </el-table-column>

            </el-table>

          
        </template>
    </div>


</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>

<script src="https://cdn.jsdelivr.net/gh/zh-lx/pinyin-pro@latest/dist/pinyin-pro.js"></script>
<script>



    const app = new Vue({
        // 挂载要管理的元素
        el: '#app',

        // 定义数据
        data() {
            return {
                columns: [],
                tableData: []
            }

        },
        mounted() {
            let data = [
                    ["参会人角色", "参会人姓名", "身份证号码", "手机号码", "是否主持人"],
                    ["董事长1", "谷雨", "4xxxx", "178xxxx", "是", "信息"],
                    ["董事长2", "谷雨2", "4xxxx2", "178xxxx2", "是", "信息2"],

                ];
             this.tableFormater(data);
        },
        methods: {
            tableFormater(data) {
                var { pinyin } = pinyinPro;
                let keys = [];
                let colums = []; //表格 头配置数组
                //这 是生成表格 表头配置
                data[0].map((item, index) => {
                    let keyArr = pinyin(item, { toneType: "none", pattern: "first", type: "array" });
                    let key = keyArr.join("") + index; //加index 是为了 防止 首字母一样的情况
                    keys.push(key);
                    let obj = {};
                    obj.key = key;
                    obj.value = item;
                    colums.push(obj);
                });
                data.splice(0, 1);//删除第一个元素 也就是表头的数组
                let tableData = [];
                data.map((item, index) => {
                    let o = {};
                    let k = "";
                    colums.map((key, index1) => {
                        o[key.key] = item[index1];
                    });
                    tableData.push(o);
                });
                this.tableData = tableData;
                this.columns = colums;
            }
        }
    })

</script>

</html>

效果图:

 

 

 总结与补充:

其实 这个 方法 vue,react都能用 方法是通用的。只不过react里 tableFormater 最后两行改成 this.setState就行(就是改成其对应的语法)。

react里 antd 的表头是靠 columns的配置 所以 colums 的配置可以改成 antd 可以接受的。 比如 key改成 dataIndex.value改成title 等等。

我提供的是一个思路,具体运用到不同的 框架 和 ui库需要 做一些变动。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崽崽的谷雨

漫漫前端路,摸爬滚打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值