封装原生html的table处理方法【参数类似eltable】

直接跑html即可

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>封装原生talbe</title>
</head>
<body>
  <div id="table_content"></div>
</body>

<script>
  // ---------------------------------------------------------封装开始------------------
  // 把vNode对象转为html字符串
  function vnodeToString(vnode) {
    // 如果是文本节点,直接返回文本内容
    if (['string', 'boolean', 'undefined', 'null', 'number'].includes(typeof vnode) || !vnode) {
      return vnode;
    }
    // 转换节点的属性为字符串形式
    const attrs = Object.keys(vnode.attrs || {})
      .map((key) => `${key}="${vnode.attrs[key]}"`)
      .join(' ');
    // 转换子节点为字符串形式
    const children = (vnode.children || [])
      .map(vnodeToString)
      .join('');
    // 返回包含标签名、属性和子节点的字符串形式
    return `<${vnode.tag} ${attrs}>${children}</${vnode.tag}>`;
  }



  class DataToExcelHtml {
    // 原始数据
    originalData = []
    // 表格列配置数据
    columnsData = []
    // 渲染数据vNode
    renderData = []
    // 表头vNode数据
    headerVNode = []
    // 表体vNode数据
    bodyVNode = []

    // 列宽
    colWidth = 120


    constructor(config) {
      this.dom = config.dom
      this.colWidth = config.colWidth || 120
      this.originalData = config.data
      this.columnsData = config.columnsData
      this._setColIndex()
      this.headerVNode = this._setHeaderVNode()
      this.bodyVNode = this._setBodyVNode()
      this.setInnerHtml()
    }


    // 取最后一层
    flattenObjectArrayLast(arr, key = "children") {
      let flattened = [];
      arr.forEach(v => {
        if (v.children && v.children.length > 0) {
          flattened = flattened.concat(this.flattenObjectArrayLast(v[key]))
        } else {
          flattened.push(v);
        }
      })
      return flattened;
    }

    // 表头   设置每个字段所在的列 行下标值
    _setColIndex(data = this.columnsData, index = 0, row_index = 0) {
      data.forEach(v => {
        v.__colspan = this.flattenObjectArrayLast(v.children || []).length || 1
        v.__rowspan = v.rowspan || 1
        v.__col_index = v.__colspan > 1 ? null : index
        v.__row_index = row_index
        index++
        if (v.children?.length) {
          index = this._setColIndex(v.children, index, row_index + 1)
        }
      })
      return index
    }

    // 设置样式
    _setStyle(col) {
      // 表样式通用
      const commonTrStyle = "height: 30px;"
      const commonBorder = 'border-width:1px;border-style:solid;border-color:#000000;'
      const commonAttrsLabel = {
        style: `text-align:${col.align || 'center'};font-size: 12px;` + commonBorder + commonTrStyle + col.styleStr,
      }
      return commonAttrsLabel
    }

    // 设置表头
    _setHeaderVNode(data = this.columnsData) {
      const that = this
      // 递归获取表头合并行深度
      let deep = (function getDeep(list) {
        let deep = 1
        list.forEach(col => {
          let curDeep = 1
          if (col.children && col.children.length) {
            curDeep += getDeep(col.children)
          }
          deep = curDeep > deep ? curDeep : deep
        })
        return deep
      })(data)



      // 递归获取表头VNode
      this.headerVNode = (function recData(list, curDeep = 1, tr = []) {
        list.forEach(col => {
          tr[col.__row_index] = tr[col.__row_index] || { tag: 'tr', children: [] }
          const obj = {
            tag: 'td',
            children: [col.label],
            attrs: {
              style: that._setStyle(col).style,
              rowspan: col.__rowspan || 1,
              colspan: col.__colspan || 1,
              width: col.width || that.colWidth,
            }
          }
          if (col.children) {
            recData(col.children, curDeep++, tr)
          } else if (!col.children?.length) {
          }
          tr[col.__row_index].children.push(obj)
        })
        return tr
      })(data)
      return this.headerVNode
    }

    _setBodyVNode(data = this.originalData, columnsData = this.columnsData) {
      const flatColumns = this.flattenObjectArrayLast(columnsData).filter(v => v.__col_index !== null)
      function getChild(row, col, index) {
        if (col.type === 'index') {
          return index + 1
        }
        return row[col.prop] || ''
      }
      this.bodyVNode = data.map((row, index) => {
        const tr = { tag: 'tr', children: [] }
        // 列下标
        flatColumns.forEach((col, idx) => {
          tr.children.push({
            tag: 'td',
            children: [getChild(row, col, index)],
            attrs: {
              style: this._setStyle(col).style,
            }
          })
        })
        return tr
      })
      return this.bodyVNode
    }

    // 设为innerHtml
    setInnerHtml(vNode = this.headerVNode) {
      const i = vnodeToString({
        tag: 'table',
        attrs: {
          style: "border-collapse: collapse;border:1px",
          border: 1,
          id: 'excel-line-data'
        },
        children: [{
          tag: 'tbody',
          attrs: {
            style: ""
          },
          children: [].concat(vNode, this.bodyVNode)
        }]
      })
      this.dom.innerHTML = i
    }
  }
  // ---------------------------------------------------------封装结束------------------

  // ---------------------------------------------------------调用
  new DataToExcelHtml({
    dom: document.querySelector('#table_content'),
    data: [
      { tlj: '测试1', time: '2023年', status: '001' },
      { tlj: '测试2', time: '2023年', status: '001' },
      { tlj: '测试3', time: '2023年', status: '001' },
      { tlj: '测试4', time: '2023年', status: '001' },
    ],
    columnsData: [
      {
        label: '标题',
        styleStr: 'color: red; font-size: 30px; font-weight: 700',
        children: [
          {
            label: 'xxx时间',
            align: 'left',
            children: [
              {
                label: "序号",
                type: 'index',
                rowspan: 2,
              },
              {
                label: "姓名",
                prop: 'tlj',
                width: 300,
                rowspan: 2,
              },
              {
                label: "---",
                children: [
                  {
                    label: "时间",
                    width: 300,
                    prop: "time"
                  },
                  {
                    label: "状态",
                    prop: "status",
                  },
                ]
              },
            ]
          }
        ]
      }
    ]
  })


</script>

<style>
  td {
    box-sizing: border-box;
    white-space: nowrap;
    min-width: 100px;
  }

  table {
    table-layout: fixed;
  }

  td {
    padding: 0 10px;
  }

  #table_content {
    overflow-x: auto;
  }
</style>

</html>

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

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

相关文章

“书写梦想 快乐成长”——沱江社区雏鹰活动(一)

为了丰富社区青少年精神文化生活&#xff0c;发挥社区服务青少年的功能和作用&#xff0c;2024年4月13日上午9点&#xff0c;中共新都区新都街道沱江社区委员会、沱江社区居民委员会联合成都市新都区领航社会工作服务中心举办的“书写梦想 快乐成长”——沱江社区雏鹰活动在沱江…

图灵奖简介及2023年获奖者Avi Wigderson的贡献

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 2023年的…

✌粤嵌—2024/3/19—环形链表

代码实现&#xff1a; 快慢指针&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ bool hasCycle(struct ListNode *head) {// 快慢指针&#xff1a;快指针每次走两步&#xff0c;慢指针每次走一步&a…

近屿OJAC带你解读:什么是GAN生成式对抗网络?

生成式对抗网络(GAN&#xff0c;英文全称Generative Adversarial Network)是一种深度学习模型&#xff0c; 由于其生成高质量、真实数据的能力&#xff0c;近年来获得了极大的关注。GAN已被用于广泛的应用 中&#xff0c;包括图像合成、⻛格转移和数据增强。 GAN的核心思想是通…

《springcloud alibaba》 六 微服务链路跟踪skywalking

目录 准备调整配置接入多个微服务网关项目调整order-seata项目stock-seata项目测试 接入网关微服务 skywalking持续化到mysql自定义链路跟踪pom .xmlorderControllerOrderServiceOrderDaoOrderTblMapper.xml测试 性能剖析日志tid打印pom.xmllogback-spring.xml日志收集启动项目…

Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftWindow.cs using UnityEngine.UI; using TMPro; using UnityEngin…

OpenCV轻松入门(七)——HSV颜色模型图像特效案例:判断白天夜晚抠图颜色过滤替换背景图

HSV模型解释 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。 这个模型中颜色的参数分别是&#xff1a; 色调&#xff08;H&#xff09;饱和度&#xff08;S&#xff09;明度&#xff08;V&…

为什么不用低代码平台制作网站,套用这11个商城主题模板,让程序员解放双手

随着人工智能技术的迅猛发展&#xff0c;众多复杂工作变得愈发简便。二十年前&#xff0c;构建一个在线商城并处理支付交易是一项艰巨任务&#xff0c;而正是在那个时代&#xff0c;零售巨头淘宝和京东崭露头角。如今&#xff0c;我们迎来了新时代&#xff0c;众多高效工具应运…

Dinov2 + Faiss 图片检索

MetaAI 通过开源 DINOv2&#xff0c;在计算机视觉领域取得了一个显着的里程碑&#xff0c;这是一个在包含1.42 亿张图像的令人印象深刻的数据集上训练的模型。产生适用于图像级视觉任务&#xff08;图像分类、实例检索、视频理解&#xff09;以及像素级视觉任务&#xff08;深度…

看完不会来揍我 | 孟德尔随机化(二)—— 代码实操 | 附代码注释 + 结果解读

最近真的是超超超超超超超级多的小伙伴们在咨询孟德尔随机化相关的问题和课程&#xff0c;意想不到的那种多&#xff01;那我怎么办嘞&#xff01;整呗&#xff01;主打的就是一个宠粉&#xff01; 关于孟德尔随机化&#xff0c;我们之前就已经在孟德尔随机化&#xff08;一&am…

PHP学习(二)

一、php 数据类型之查看和判断数据类型 查看数据类型 1.gettype(传入一个变量) 能够获得变量的类型 2.var_dump(传入一个变量) 输出变量类型和值 <?php //声明一个变量 88.8 $f 88.8; $type gettype($f); echo $type; ?> <?php //多换几个类型试试 $str 你…

【wu-framework-parent】官网介绍

官网地址 介绍 springboot 版本3.2.1 wu-framework-parent 是一款由Java语言开发的框架&#xff0c;目标不写代码但是却能完成功能。 框架涵盖无赖ORM( wu-framework-lazy-orm-spring-starter)、仿生组件 、easy框架系列【Easy-Excel、easy-listener、easy-upsert】 授权框架…

数字乡村创新实践探索农业现代化与农村治理现代化新路径:科技赋能农村全面振兴与农民幸福生活

目录 引言 一、数字乡村与农业现代化 1、智慧农业技术的应用 2、农业产业链的数字化转型 二、数字乡村与农村治理现代化 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民幸福生活 1、提升农业生产效益与农民收入 2、促进农村产业结构…

[每周一更]-第93期:探索大型生成式聊天工具:从ChatGPT到未来

随着人工智能技术的不断进步&#xff0c;生成式聊天工具正逐渐成为人们日常生活中的一部分。这些工具利用深度学习技术和大规模语言模型的强大能力&#xff0c;能够与用户进行自然、流畅的对话&#xff0c;为我们提供了更加智能和个性化的交流体验。 ChatGPT&#xff1a;开启生…

mac电脑软件 Magnet v2.14.0免激活中文版

Magnet是一款窗口管理工具&#xff0c;适用于Mac操作系统。它可以帮助用户轻松地管理和组织多个应用程序的窗口&#xff0c;提高工作效率。 Magnet支持多种窗口布局和组合方式&#xff0c;可以将窗口分为左右、上下、四分之一等不同的比例和位置&#xff0c;用户可以根据实际需…

Linux:Redis7.2.4的简单在线部署(1)

注意&#xff1a;我写的这个文章是以最快速的办法去搭建一个redis的基础环境&#xff0c;作用是为了做实验简单的练习&#xff0c;如果你想搭建一个相对稳定的redis去使用&#xff0c;可以看我下面这个文章 Linux&#xff1a;Redis7.2.4的源码包部署&#xff08;2&#xff09;-…

测试人必看,小程序常见问题

小程序是一种轻盈的存在&#xff0c;用户无需为了使用它而下载和安装。它依附于微信这个强大的平台&#xff0c;只需轻轻一扫或一搜&#xff0c;它便跃然屏上&#xff0c;随时服务。小程序为我们带来更多前所未有的惊喜和便利&#xff0c;以下分享关于小程序相关的热门问题。 …

Adaptive Influence Maximization in DynamicSocial Networks

Abstract 为了通过社交网络传播信息和思想&#xff0c;种子策略旨在找到一小部分能够最大化影响力传播的种子用户&#xff0c;这被称为影响力最大化问题。尽管有大量的工作研究了这个问题&#xff0c;但现有的播种策略仅限于静态社交网络。事实上&#xff0c;由于数据传输速度快…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

【详细讲解下Photoshop】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…