js操作excel常用方法,js制作表格代码

2023-12-05

这篇文章主要介绍了js操作excel常用方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。

本文基于react项目实现。

起因

接了一个需求,要求实现点击页面上的一个按钮,复制某个表格数据,然后ctrl+V到Excel表格中 Python中的所有运算符号

思考

其实我觉着这个功能用导出Excel的方式实现不就好了么。不过本着好奇的心思,还是试着做做看吧。
首先,点击按钮的时候要拿到要复制的数据。最初是想通过获取DOM元素的方式来取得表格,可是这样的话,得到的就是含有html标签的一堆字符串。那么只能自己来拼装数据了。我把表格部分的数据通过复制、黏贴到编辑器看下他是什么,结果如下图:

而页面上的表格是这样的:

对比来看:跟页面上的表格差别不大。
其次,要把数据组装好之后,要通过JS的方式放到剪切板中。这个有点难度了。通过查资料下面这种方式可以改变剪切板的内容。

 document.addEventListener("copy", (event) => {
      if (copyEvent) {
        if (event.clipboardData || event.originalEvent) {
          var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
          const selection = "好激动12312412\nhahahha";
          clipboardData.setData('text/plain', selection.toString());
          event.preventDefault();
        }
      }
    });

那么,问题来了,这里是通过监听copy事件来改变剪切板的内容的,但是我们点击按钮到复制到Excel里面,这过程中并没有触发ctrl+C的操作啊?
那么只能点击按钮的时候来触发了。 document.execCommand('copy') 可以实现。
然后,由于是在document上做的监听,那么页面上所有的复制操作都被拦截了,换成我们拼接的内容啦。显然这不是我们想要的。于是我想到了开关,在点击按钮的时候打开开关,然后触发copy事件,在监听事件中判断开关状态,这样就能过滤掉其他位置的复制的操作了。

实现

• 先准备环境、数据

import { Button, Table } from 'antd';
import { useEffect } from 'react'
import './App.css';
const dataSource = [
  {
    key: '1',
    name: '胡彦斌',
    age: 32,
    address: '西湖区湖底公园1号',
  },
  {
    key: '2',
    name: '胡彦祖',
    age: 42,
    address: '西湖区湖底公园1号',
  },
];
const columns = [
  {
    title: '姓名',
    dataIndex: 'name',
    key: 'name',
  },
  {
    title: '年龄',
    dataIndex: 'age',
    key: 'age',
  },
  {
    title: '住址',
    dataIndex: 'address',
    key: 'address',
  },
]
const btnClick = () => {
  
}
function App() {
  return (
    <div className="App">
      <header className="App-header">
        <Button type="primary" onClick={btnClick}>复制</Button>
        <Table dataSource={dataSource} columns={columns} />
      </header>
    </div>
  );
}
export default App;

• 监听copy事件,点击按钮的时候触发copy事件

const btnClick = () => {
  document.execCommand('copy')
}
  useEffect(() => {
    document.addEventListener("copy", (event) => {
        if (event.clipboardData || event.originalEvent) {
          var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
          const selection = "好激动12312412\nhahahha";
          clipboardData.setData('text/plain', selection.toString());
          event.preventDefault();
          copyEvent = false
        }
    });
  }, []);

• 添加开关、拼接数据

let copyEvent = false // 开关
const btnClick = () => {
  copyEvent = true
  document.execCommand('copy')
}
  useEffect(() => {
    document.addEventListener("copy", (event) => {
      if (copyEvent) {
        if (event.clipboardData || event.originalEvent) {
          var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
          // 拼接数据 
          const first = columns.map(item=>item.title).join('\t')
          const sec = dataSource.map(item=> `${item.name}\t${item.age} \t${item.address}`).join('\n')
          const selection = `${first}\n${sec}`
          clipboardData.setData('text/plain', selection.toString());
          event.preventDefault();
          copyEvent = false // 关掉开关
        }
      }
    });
  }, []);

\t是制表符,在Excel中就是单元格分隔。\n是换行符,对应Excel就是不同行。
复制到Excel中的效果:

完整代码

import { Button, Table } from 'antd';
import { useEffect } from 'react'
import './App.css';
const dataSource = [
  {
    key: '1',
    name: '胡彦斌',
    age: 32,
    address: '西湖区湖底公园1号',
  },
  {
    key: '2',
    name: '胡彦祖',
    age: 42,
    address: '西湖区湖底公园1号',
  },
];
const columns = [
  {
    title: '姓名',
    dataIndex: 'name',
    key: 'name',
  },
  {
    title: '年龄',
    dataIndex: 'age',
    key: 'age',
  },
  {
    title: '住址',
    dataIndex: 'address',
    key: 'address',
  },
]
let copyEvent = false // 开关
const btnClick = () => {
  copyEvent = true
  document.execCommand('copy')
}
function App() {
  useEffect(() => {
    document.addEventListener("copy", (event) => {
      if (copyEvent) {
        if (event.clipboardData || event.originalEvent) {
          var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
          // 拼接数据 
          const first = columns.map(item=>item.title).join('\t')
          const sec = dataSource.map(item=> `${item.name}\t${item.age} \t${item.address}`).join('\n')
          const selection = `${first}\n${sec}`
          clipboardData.setData('text/plain', selection.toString());
          event.preventDefault();
          copyEvent = false // 关掉开关
        }
      }
    });
  }, []);
  return (
    <div className="App">
      <header className="App-header">
        <Button type="primary" onClick={btnClick}>复制</Button>
        <Table dataSource={dataSource} columns={columns} />
      </header>
    </div>
  );
}
export default App;

参考

execCommand
JS设置获取剪切板内容

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js操作excel常用方法,js制作表格代码 的相关文章

随机推荐

  • MySQL InnoDB 如何实现行锁?

    行级锁是 MySQL 中粒度最小的一种锁 他能大大减少数据库操作的冲突 INNODB 的行级锁有共享锁 S LOCK 和排他锁 X LOCK 两种 共享锁允许事物读一行记录 不允许任何线程对该行记录进行修改 排他锁允许当前事物删除或更新一行
  • MySQL中一些重要的日志文件:二进制日志binlog、事务日志redolog

    MySQL包含多个重要的日志文件 用于记录数据库的操作和状态信息 下面是MySQL中一些重要的日志文件 错误日志 Error Log 错误日志记录了MySQL服务器在启动 运行和关闭过程中发生的错误和警告信息 它是排查和解决问题的重要依据
  • 超出重复率情况说明【一文读懂】

    大家好 今天来聊聊超出重复率情况说明 希望能给大家提供一点参考 以下是针对论文重复率高的情况 提供一些修改建议和技巧 超出重复率情况说明 在数据处理和分析过程中 有时会遇到数据重复率超出预定范围的情况 智能写作 这种情况可能会导致数据质量下
  • 论文重复率和查重率一样吗【详细教程】

    大家好 今天来聊聊论文重复率和查重率一样吗 希望能给大家提供一点参考 以下是针对论文重复率高的情况 提供一些修改建议和技巧 论文重复率和查重率一样吗 摘要 在论文撰写过程中 了解论文重复率和查重率的概念及其关系是非常重要的 伪原创 本文将详
  • MySQL中,什么是脏页和干净页?

    MySQL 为了操作的性能优化 会把数据更新先放入内存中 之后再统一更新到磁盘 当内存数据和磁盘数据内容不一致的时候 我们称这个内存页为脏页 内存数据写到磁盘后 内存的数据和磁盘上的内容就一致了 我们称为 干净页 在MySQL中 脏页 Di
  • MySQL InnoDB 存储引擎有几种锁算法?

    Record Lock 单个行记录上的锁 Gap Lock 间隙锁 锁定一个范围 不包括记录本身 Next Key Lock 锁定一个范围 包括记录本身 MySQL InnoDB存储引擎主要使用两种锁算法 分别是行级锁和间隙锁 行级锁 Ro
  • 浅谈安科瑞无线测温设备在挪威某项目的应用

    摘要 安科瑞无线温度设备装置通过无线温度收发器和各无线温度传感器直接进行温度值的传输 并采用液晶显示各无线温度传感器所测温度 Absrtact Acre wireless temperature device directly transm
  • yum 操作,出现Cannot retrieve metalink for repository: epel/x86_64

    详细报错如下 Loaded plugins fastestmirror Determining fastest mirrors One of the configured repositories failed Unknown and yu
  • 2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④

    2024年甘肃省职业院校技能大赛 中职教师组 网络安全竞赛样题卷 2024年甘肃省职业院校技能大赛 中职教师组 网络安全竞赛样题卷 A模块基础设施设置 安全加固 本模块200分 A 1任务一 登录安全加固 Windows A 2任务二 本地
  • 什么是Redo Log Buffer缓冲区?

    Redo Log 重做日志 会先存储在内存中 在MySQL中 Redo Log是一种事务日志 用于记录正在进行中的事务的修改操作 当事务执行更新操作 如插入 更新 删除 时 MySQL会先将对应的Redo Log记录写入到内存中的Redo
  • MySQL 刷脏页的速度很慢可能是什么原因?

    在 MySQL 中单独刷一个脏页的速度是很快的 如果发现刷脏页的速度很慢 说明触发了 MySQL 刷脏页的 连坐 机制 MySQL 的 连坐 机制是指当 MySQL 刷脏页的时候如果发现相邻的数据页也是脏页也会一起刷掉 而这个动作可以一直蔓
  • 使用idea如何快速的搭建ssm的开发环境

    文章目录 唠嗑部分 言归正传 1 打开idea 点击新建项目 2 填写信息 3 找到pom xml先添加springboot父依赖
  • netty源码:(3) ThreadPerTaskExecutor

    这个类封装了一个ThreadFactory 同时提供了一个execute方法 用来把Runnable提交给ThreadFactory来执行
  • Jmeter接口自动化测试 —— Jmeter变量的使用

    专注于分享软件测试干货内容 欢迎点赞 收藏 留言 如有错误敬请指正 交流讨论 欢迎加入我们一起学习 资源分享 耗时200 小时精选的 软件测试 资料包 最困难的时候 也就是我们离成功不远的时候 在使用jmeter进行接口测试时 我们难免会遇
  • C#与Java的不同

    https www cnblogs com Yan3399 p 17324904 html 1 C 对应java中关键字 base super this this sealed final 1 base关键字 对应java super C
  • 英伟达狂卖50万台GPU!AI爆火背后,是显卡的争夺

    据市场跟踪公司Omdia的统计分析 英伟达在第三季度大约卖出了50万台H100和A100 GPU 此前 Omdia通过英伟达第二季度的销售额 估计其大概卖出了900吨GPU 大语言模型火爆的背后 英伟达建立起了强大的显卡帝国 在人工智能的大
  • 搭建 ebpf 开发测试环境

    0 内容说明 这部分主要讲述了如何通过官网学习ebpf 以及如何搭建自己的ebpf开发测试环境 主要是需要安装哪些工具链 1 ebpf在线学习 ebpf官网中提供了一个快速在线学习ebpf的路径 在这个学习平台中一共有两项学习内容 一个是学
  • Perplexity发布两款LLM模型:pplx-7b-online和pplx-70b-online 可利用实时互联网数据查询

    Perplexity AI 一家创新的人工智能初创公司 近日推出了一项能够改变信息检索系统的解决方案 该公司推出了两款新的大语言模型 LLMs 分别是 pplx 7b online 和 pplx 70b online 标志着首次通过API公
  • 求最大公约数,和最小公倍数的规则

    求最大公约数 和最小公倍数的规则 最大公约数 Greatest Common Divisor 简称GCD 是指两个或多个整数共有约数中最大的一个 例如 12和18的最大公约数是6 因为12和18同时都能被6整除 求最大公约数的规则包括 辗转
  • js操作excel常用方法,js制作表格代码

    这篇文章主要介绍了js操作excel常用方法 具有一定借鉴价值 需要的朋友可以参考下 希望大家阅读完这篇文章后大有收获 下面让小编带着大家一起了解一下 本文基于react项目实现 起因 接了一个需求 要求实现点击页面上的一个按钮 复制某个表