当前位置:   article > 正文

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

js excel

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

本文基于react项目实现。

起因

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

思考

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

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

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

  1. document.addEventListener("copy", (event) => {
  2. if (copyEvent) {
  3. if (event.clipboardData || event.originalEvent) {
  4. var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
  5. const selection = "好激动12312412\nhahahha";
  6. clipboardData.setData('text/plain', selection.toString());
  7. event.preventDefault();
  8. }
  9. }
  10. });

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

实现

• 先准备环境、数据

  1. import { Button, Table } from 'antd';
  2. import { useEffect } from 'react'
  3. import './App.css';
  4. const dataSource = [
  5. {
  6. key: '1',
  7. name: '胡彦斌',
  8. age: 32,
  9. address: '西湖区湖底公园1号',
  10. },
  11. {
  12. key: '2',
  13. name: '胡彦祖',
  14. age: 42,
  15. address: '西湖区湖底公园1号',
  16. },
  17. ];
  18. const columns = [
  19. {
  20. title: '姓名',
  21. dataIndex: 'name',
  22. key: 'name',
  23. },
  24. {
  25. title: '年龄',
  26. dataIndex: 'age',
  27. key: 'age',
  28. },
  29. {
  30. title: '住址',
  31. dataIndex: 'address',
  32. key: 'address',
  33. },
  34. ]
  35. const btnClick = () => {
  36. }
  37. function App() {
  38. return (
  39. <div className="App">
  40. <header className="App-header">
  41. <Button type="primary" onClick={btnClick}>复制</Button>
  42. <Table dataSource={dataSource} columns={columns} />
  43. </header>
  44. </div>
  45. );
  46. }
  47. export default App;

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

  1. const btnClick = () => {
  2. document.execCommand('copy')
  3. }
  4. useEffect(() => {
  5. document.addEventListener("copy", (event) => {
  6. if (event.clipboardData || event.originalEvent) {
  7. var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
  8. const selection = "好激动12312412\nhahahha";
  9. clipboardData.setData('text/plain', selection.toString());
  10. event.preventDefault();
  11. copyEvent = false
  12. }
  13. });
  14. }, []);

• 添加开关、拼接数据

  1. let copyEvent = false // 开关
  2. const btnClick = () => {
  3. copyEvent = true
  4. document.execCommand('copy')
  5. }
  6. useEffect(() => {
  7. document.addEventListener("copy", (event) => {
  8. if (copyEvent) {
  9. if (event.clipboardData || event.originalEvent) {
  10. var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
  11. // 拼接数据
  12. const first = columns.map(item=>item.title).join('\t')
  13. const sec = dataSource.map(item=> `${item.name}\t${item.age} \t${item.address}`).join('\n')
  14. const selection = `${first}\n${sec}`
  15. clipboardData.setData('text/plain', selection.toString());
  16. event.preventDefault();
  17. copyEvent = false // 关掉开关
  18. }
  19. }
  20. });
  21. }, []);

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

完整代码

  1. import { Button, Table } from 'antd';
  2. import { useEffect } from 'react'
  3. import './App.css';
  4. const dataSource = [
  5. {
  6. key: '1',
  7. name: '胡彦斌',
  8. age: 32,
  9. address: '西湖区湖底公园1号',
  10. },
  11. {
  12. key: '2',
  13. name: '胡彦祖',
  14. age: 42,
  15. address: '西湖区湖底公园1号',
  16. },
  17. ];
  18. const columns = [
  19. {
  20. title: '姓名',
  21. dataIndex: 'name',
  22. key: 'name',
  23. },
  24. {
  25. title: '年龄',
  26. dataIndex: 'age',
  27. key: 'age',
  28. },
  29. {
  30. title: '住址',
  31. dataIndex: 'address',
  32. key: 'address',
  33. },
  34. ]
  35. let copyEvent = false // 开关
  36. const btnClick = () => {
  37. copyEvent = true
  38. document.execCommand('copy')
  39. }
  40. function App() {
  41. useEffect(() => {
  42. document.addEventListener("copy", (event) => {
  43. if (copyEvent) {
  44. if (event.clipboardData || event.originalEvent) {
  45. var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
  46. // 拼接数据
  47. const first = columns.map(item=>item.title).join('\t')
  48. const sec = dataSource.map(item=> `${item.name}\t${item.age} \t${item.address}`).join('\n')
  49. const selection = `${first}\n${sec}`
  50. clipboardData.setData('text/plain', selection.toString());
  51. event.preventDefault();
  52. copyEvent = false // 关掉开关
  53. }
  54. }
  55. });
  56. }, []);
  57. return (
  58. <div className="App">
  59. <header className="App-header">
  60. <Button type="primary" onClick={btnClick}>复制</Button>
  61. <Table dataSource={dataSource} columns={columns} />
  62. </header>
  63. </div>
  64. );
  65. }
  66. export default App;

参考

execCommand
JS设置获取剪切板内容

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/888719
推荐阅读
相关标签
  

闽ICP备14008679号