前端表格复制粘贴主动根据标识举行添补

[复制链接]
发表于 2025-12-31 11:24:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这个需求是公司之前筹划开发的一个项目须要,背面公司并没有开始这个项目,但是我之前稍微弄了一点,以是也在此记载吧。需求是须要在 wps 大概 excel 的表格中复制一个表格,然后在前端的表格中主动根据 姓名 去举行添补,下面我来演示一下功能。
wps 的表格:

前端表格:

我们把刚刚从 wps 复制的表格 到我们前端的表格 举行 粘贴:

来大概说一下过程,提供思绪,不外代码是之前写的了,只能说个大概
利用的前段表格控件是 lucksheet,官网地点: Luckysheet 已不再维护,保举利用 Univer 更换 | Luckysheet文档
lucksheet 给我们提供了一个设置 rangePasteBefore,可以举行选区利用

我的思绪就是可以获取到须要粘贴的数据,然后又可以获取到表格的数据,对比两份数据,找到 姓名 那一行,举行处理处罚,处理处罚完之后再添补到前端表格
下面来看一下我的代码,留意,代码中已经写了必须是根据 姓名来匹配数据,须要根据其他的,你们本身调解,在我的代码中会报错,我没有继续研究这个东西了,以是没有处理处罚。
内里会用到 lucksheet 的依赖,这是我上传的依赖地点 ,解压后和代码文件放在同级目次下就可以
大概你们可以看官网的,用官网上面的,重要是 rangePasteBefore 方法内里的内容
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8" />
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6.   <title>Document</title>
  7.   <link rel="stylesheet" href="./dist/plugins/css/pluginsCss.css" />
  8.   <link rel="stylesheet" href="./dist/plugins/plugins.css" />
  9.   <link rel="stylesheet" href="./dist/css/luckysheet.css" />
  10.   <link rel="stylesheet" href="./dist/assets/iconfont/iconfont.css" />
  11.   <script src="./dist/plugins/js/plugin.js"></script>
  12.   <script src="./dist/luckysheet.umd.js"></script>
  13.   <style>
  14.     .ipt {
  15.       position: absolute;
  16.       top: 0;
  17.       left: 0;
  18.       z-index: 10;
  19.     }
  20.   </style>
  21. </head>
  22. <body>
  23.   <input class="ipt" type="file" />
  24.   <div id="luckysheet" style="
  25.         margin: 0px;
  26.         padding: 0px;
  27.         position: absolute;
  28.         width: 100%;
  29.         height: 100%;
  30.         left: 0px;
  31.         top: 0px;
  32.       "></div>
  33.   <script>
  34.     $(function () {
  35.       //配置项
  36.       var options = {
  37.         container: "luckysheet", //luckysheet为容器id
  38.         title: "表格的名字", // 设定表格名称
  39.         lang: "zh", // 设定表格语言
  40.         allowCopy: false, // 是否可复制
  41.         showtoolbarConfig: {
  42.           // undoRedo: false, //撤销重做,注意撤消重做是两个按钮,由这一个配置决定显示还是隐藏
  43.           // paintFormat: false, //格式刷
  44.           // currencyFormat: false, //货币格式
  45.           // percentageFormat: false, //百分比格式
  46.           // numberDecrease: false, // '减少小数位数'
  47.           // numberIncrease: false, // '增加小数位数
  48.           // moreFormats: false, // '更多格式'
  49.           // font: false, // '字体'
  50.           // fontSize: false, // '字号大小'
  51.           // bold: false, // '粗体 (Ctrl+B)'
  52.           // italic: false, // '斜体 (Ctrl+I)'
  53.           // strikethrough: false, // '删除线 (Alt+Shift+5)'
  54.           // underline: false, // '下划线 (Alt+Shift+6)'
  55.           // textColor: false, // '文本颜色'
  56.           // fillColor: false, // '单元格颜色'
  57.           // border: false, // '边框'
  58.           // mergeCell: false, // '合并单元格'
  59.           // horizontalAlignMode: false, // '水平对齐方式'
  60.           // verticalAlignMode: false, // '垂直对齐方式'
  61.           // textWrapMode: false, // '换行方式'
  62.           // textRotateMode: false, // '文本旋转方式'
  63.           // image: false, // '插入图片'
  64.           // link: false, // '插入链接'
  65.           // chart: false, // '图表'(图标隐藏,但是如果配置了chart插件,右击仍然可以新建图表)
  66.           // postil: false, //'批注'
  67.           // pivotTable: false, //'数据透视表'
  68.           // function: false, // '公式'
  69.           // frozenMode: false, // '冻结方式'
  70.           // sortAndFilter: false, // '排序和筛选'
  71.           // conditionalFormat: false, // '条件格式'
  72.           // dataVerification: false, // '数据验证'
  73.           // splitColumn: false, // '分列'
  74.           // screenshot: false, // '截图'
  75.           // findAndReplace: false, // '查找替换'
  76.           // protection: false, // '工作表保护'
  77.           // print: false, // '打印'
  78.         },
  79.         showsheetbarConfig: {
  80.           // add: false, //新增sheet
  81.           // menu: false, //sheet管理菜单
  82.           // sheet: false, //sheet页显示
  83.         },
  84.         showstatisticBar: false,
  85.         showstatisticBarConfig: {
  86.           zoom: true,
  87.         },
  88.         sheetRightClickConfig: {
  89.           delete: false, // 删除
  90.           copy: false, // 复制
  91.           rename: false, //重命名
  92.           color: false, //更改颜色
  93.           hide: false, //隐藏,取消隐藏
  94.           move: false, //向左移,向右移
  95.         },
  96.         rowHeaderWidth: 88,
  97.         pager: {
  98.           pageIndex: 1, //当前的页码
  99.           pageSize: 10, //每页显示多少行数据
  100.           total: 50, //数据总行数
  101.           selectOption: [10, 20], //允许设置每页行数的选项
  102.         },
  103.         cellUpdateBefore(r, c) {
  104.           console.log(r, c, "rc");
  105.         },
  106.         hook: {
  107.           rangePasteBefore: function (range, data) {
  108.             console.info("range", range);
  109.             // console.info("data", data);
  110.             // console.log("range", range);
  111.             // console.log("data", data);
  112.             // console.log(
  113.             //   luckysheet.getAllSheets()[0],
  114.             //   "luckysheet.getAllSheets()[0]"
  115.             // );
  116.             const originArr = luckysheet.getSheetData();
  117.             // console.log(originArr, "getSheetData");
  118.             // 创建一个虚拟的DOM元素,加载HTML内容
  119.             // #region
  120.             const parser = new DOMParser();
  121.             const htmlDoc = parser.parseFromString(data, "text/html");
  122.             // 获取包含表格数据的table元素
  123.             const table = htmlDoc.querySelector("table");
  124.             // 初始化空数组用于存储提取的数据
  125.             const arr = [];
  126.             // 遍历表格的每一行
  127.             table.querySelectorAll("tr").forEach((row) => {
  128.               const rowData = [];
  129.               // 遍历当前行的每个单元格
  130.               row.querySelectorAll("td").forEach((cell) => {
  131.                 // 提取单元格的文本内容并添加到当前行数据中
  132.                 rowData.push(cell.textContent.trim());
  133.               });
  134.               // 将当前行数据添加到数组中
  135.               arr.push(rowData);
  136.             });
  137.             // // 输出提取的数组
  138.             // console.log(arr, "arr");
  139.             // //#endregion
  140.             function findMatches(arr, originArr) {
  141.               // 初始化结果数组
  142.               let mateArr = [];
  143.               // 获取表头,即arr的第一行数据
  144.               let headers = arr[0];
  145.               // 获取两张表的姓名所在索引
  146.               let arrNameIndex = headers.findIndex((el) => el === "姓名");
  147.               let originArrNameIndex = originArr[0].findIndex(
  148.                 (el) => el.v === "姓名"
  149.               );
  150.               // 遍历arr中除表头外的每一行
  151.               for (let i = 1; i < arr.length; i++) {
  152.                 // 遍历每一列
  153.                 for (let j = 0; j < arr[i].length; j++) {
  154.                   // 获取当前单元格的值
  155.                   let cellValue = arr[i][j];
  156.                   // 查找在originArr中对应的行索引
  157.                   let rowIndex = originArr.findIndex(
  158.                     (obj) =>
  159.                       obj &&
  160.                       obj[originArrNameIndex].v === arr[i][arrNameIndex]
  161.                   );
  162.                   // 查找在originArr中对应的列索引
  163.                   let columnIndex = originArr[0].findIndex(
  164.                     (obj) => obj && obj.v === headers[j]
  165.                   );
  166.                   // 如果找到对应的列
  167.                   if (columnIndex !== -1 && rowIndex !== -1) {
  168.                     // 将行索引、列索引和单元格值添加到结果数组
  169.                     mateArr.push([rowIndex, columnIndex, cellValue]);
  170.                   }
  171.                 }
  172.               }
  173.               return mateArr;
  174.             }
  175.             // 使用示例
  176.             const mateArr = findMatches(arr, originArr);
  177.             // console.log(mateArr, "mateArr");
  178.             mateArr.forEach((el, index) => {
  179.               luckysheet.setCellValue(el[0], el[1], el[2]);
  180.             });
  181.             // luckysheet.setCellValue(48, 2, "有值了吗");
  182.             return false; //Can intercept paste
  183.           },
  184.         },
  185.       };
  186.       luckysheet.create(options);
  187.       // console.log(luckysheet.luckysheetfile[0].data, "luckysheetfile");
  188.       console.log(luckysheet.getCellValue(0, 0), "123");
  189.       // window.luckysheet.setCellValue(0, 0, "有值了吗");
  190.       // setTimeout(() => {
  191.       //   luckysheet.setCellValue(0, 0, "有值了吗");
  192.       //   console.log(
  193.       //     luckysheet.getAllSheets()[0],
  194.       //     "luckysheet.getAllSheets()[0]"
  195.       //   );
  196.       // }, 2000);
  197.     });
  198.   </script>
  199. </body>
  200. </html>
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表