自学内容网 自学内容网

前端表格复制粘贴自动根据标识进行填充

这个需求是公司之前打算开发的一个项目需要,后面公司并没有开始这个项目,但是我之前稍微弄了一点,所以也在此记录吧。需求是需要在 wps 或者 excel 的表格中复制一个表格,然后在前端的表格中自动根据 姓名 去进行填充,下面我来演示一下功能。

wps 的表格:

前端表格:

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

来大概说一下过程,提供思路,不过代码是之前写的了,只能说个大概

使用的前段表格控件是 lucksheet,官网地址: Luckysheet 已不再维护,推荐使用 Univer 替代 | Luckysheet文档

lucksheet 给我们提供了一个配置 rangePasteBefore,可以进行选区操作

我的思路就是可以获取到需要粘贴的数据,然后又可以获取到表格的数据,对比两份数据,找到 姓名 那一行,进行处理,处理完之后再填充到前端表格

下面来看一下我的代码,注意,代码中已经写了必需是根据 姓名来匹配数据,需要根据其他的,你们自己调整,在我的代码中会报错,我没有继续研究这个东西了,所以没有处理。

里面会用到 lucksheet 的依赖,这是我上传的依赖地址 ,解压后和代码文件放在同级目录下就可以https://download.csdn.net/download/lotpyve/89942368

或者你们可以看官网的,用官网上面的,主要是 rangePasteBefore 方法里面的内容

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

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <link rel="stylesheet" href="./dist/plugins/css/pluginsCss.css" />
  <link rel="stylesheet" href="./dist/plugins/plugins.css" />
  <link rel="stylesheet" href="./dist/css/luckysheet.css" />
  <link rel="stylesheet" href="./dist/assets/iconfont/iconfont.css" />
  <script src="./dist/plugins/js/plugin.js"></script>
  <script src="./dist/luckysheet.umd.js"></script>
  <style>
    .ipt {
      position: absolute;
      top: 0;
      left: 0;
      z-index: 10;
    }
  </style>
</head>

<body>
  <input class="ipt" type="file" />
  <div id="luckysheet" style="
        margin: 0px;
        padding: 0px;
        position: absolute;
        width: 100%;
        height: 100%;
        left: 0px;
        top: 0px;
      "></div>
  <script>
    $(function () {
      //配置项
      var options = {
        container: "luckysheet", //luckysheet为容器id
        title: "表格的名字", // 设定表格名称
        lang: "zh", // 设定表格语言
        allowCopy: false, // 是否可复制
        showtoolbarConfig: {
          // undoRedo: false, //撤销重做,注意撤消重做是两个按钮,由这一个配置决定显示还是隐藏
          // paintFormat: false, //格式刷
          // currencyFormat: false, //货币格式
          // percentageFormat: false, //百分比格式
          // numberDecrease: false, // '减少小数位数'
          // numberIncrease: false, // '增加小数位数
          // moreFormats: false, // '更多格式'
          // font: false, // '字体'
          // fontSize: false, // '字号大小'
          // bold: false, // '粗体 (Ctrl+B)'
          // italic: false, // '斜体 (Ctrl+I)'
          // strikethrough: false, // '删除线 (Alt+Shift+5)'
          // underline: false, // '下划线 (Alt+Shift+6)'
          // textColor: false, // '文本颜色'
          // fillColor: false, // '单元格颜色'
          // border: false, // '边框'
          // mergeCell: false, // '合并单元格'
          // horizontalAlignMode: false, // '水平对齐方式'
          // verticalAlignMode: false, // '垂直对齐方式'
          // textWrapMode: false, // '换行方式'
          // textRotateMode: false, // '文本旋转方式'
          // image: false, // '插入图片'
          // link: false, // '插入链接'
          // chart: false, // '图表'(图标隐藏,但是如果配置了chart插件,右击仍然可以新建图表)
          // postil: false, //'批注'
          // pivotTable: false, //'数据透视表'
          // function: false, // '公式'
          // frozenMode: false, // '冻结方式'
          // sortAndFilter: false, // '排序和筛选'
          // conditionalFormat: false, // '条件格式'
          // dataVerification: false, // '数据验证'
          // splitColumn: false, // '分列'
          // screenshot: false, // '截图'
          // findAndReplace: false, // '查找替换'
          // protection: false, // '工作表保护'
          // print: false, // '打印'
        },
        showsheetbarConfig: {
          // add: false, //新增sheet
          // menu: false, //sheet管理菜单
          // sheet: false, //sheet页显示
        },
        showstatisticBar: false,
        showstatisticBarConfig: {
          zoom: true,
        },
        sheetRightClickConfig: {
          delete: false, // 删除
          copy: false, // 复制
          rename: false, //重命名
          color: false, //更改颜色
          hide: false, //隐藏,取消隐藏
          move: false, //向左移,向右移
        },
        rowHeaderWidth: 88,
        pager: {
          pageIndex: 1, //当前的页码
          pageSize: 10, //每页显示多少行数据
          total: 50, //数据总行数
          selectOption: [10, 20], //允许设置每页行数的选项
        },
        cellUpdateBefore(r, c) {
          console.log(r, c, "rc");
        },
        hook: {
          rangePasteBefore: function (range, data) {
            console.info("range", range);
            // console.info("data", data);
            // console.log("range", range);
            // console.log("data", data);
            // console.log(
            //   luckysheet.getAllSheets()[0],
            //   "luckysheet.getAllSheets()[0]"
            // );
            const originArr = luckysheet.getSheetData();
            // console.log(originArr, "getSheetData");
            // 创建一个虚拟的DOM元素,加载HTML内容
            // #region
            const parser = new DOMParser();
            const htmlDoc = parser.parseFromString(data, "text/html");
            // 获取包含表格数据的table元素
            const table = htmlDoc.querySelector("table");
            // 初始化空数组用于存储提取的数据
            const arr = [];
            // 遍历表格的每一行
            table.querySelectorAll("tr").forEach((row) => {
              const rowData = [];
              // 遍历当前行的每个单元格
              row.querySelectorAll("td").forEach((cell) => {
                // 提取单元格的文本内容并添加到当前行数据中
                rowData.push(cell.textContent.trim());
              });
              // 将当前行数据添加到数组中
              arr.push(rowData);
            });
            // // 输出提取的数组
            // console.log(arr, "arr");
            // //#endregion

            function findMatches(arr, originArr) {
              // 初始化结果数组
              let mateArr = [];

              // 获取表头,即arr的第一行数据
              let headers = arr[0];

              // 获取两张表的姓名所在索引
              let arrNameIndex = headers.findIndex((el) => el === "姓名");
              let originArrNameIndex = originArr[0].findIndex(
                (el) => el.v === "姓名"
              );

              // 遍历arr中除表头外的每一行
              for (let i = 1; i < arr.length; i++) {
                // 遍历每一列
                for (let j = 0; j < arr[i].length; j++) {
                  // 获取当前单元格的值
                  let cellValue = arr[i][j];
                  // 查找在originArr中对应的行索引

                  let rowIndex = originArr.findIndex(
                    (obj) =>
                      obj &&
                      obj[originArrNameIndex].v === arr[i][arrNameIndex]
                  );
                  // 查找在originArr中对应的列索引
                  let columnIndex = originArr[0].findIndex(
                    (obj) => obj && obj.v === headers[j]
                  );

                  // 如果找到对应的列
                  if (columnIndex !== -1 && rowIndex !== -1) {
                    // 将行索引、列索引和单元格值添加到结果数组
                    mateArr.push([rowIndex, columnIndex, cellValue]);
                  }
                }
              }

              return mateArr;
            }

            // 使用示例
            const mateArr = findMatches(arr, originArr);
            // console.log(mateArr, "mateArr");
            mateArr.forEach((el, index) => {
              luckysheet.setCellValue(el[0], el[1], el[2]);
            });
            // luckysheet.setCellValue(48, 2, "有值了吗");
            return false; //Can intercept paste
          },
        },
      };
      luckysheet.create(options);

      // console.log(luckysheet.luckysheetfile[0].data, "luckysheetfile");
      console.log(luckysheet.getCellValue(0, 0), "123");
      // window.luckysheet.setCellValue(0, 0, "有值了吗");
      // setTimeout(() => {
      //   luckysheet.setCellValue(0, 0, "有值了吗");
      //   console.log(
      //     luckysheet.getAllSheets()[0],
      //     "luckysheet.getAllSheets()[0]"
      //   );
      // }, 2000);
    });
  </script>
</body>

</html>


原文地址:https://blog.csdn.net/lotpyve/article/details/143432335

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!