LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【WEB】自定义打印模板?如何实现拖拽元素到在线电子表格x-spreadsheet?

admin
2024年6月11日 16:10 本文热度 2524

需求是实现自定义打印模板,经过三天苦逼的调研,技术选型,分析,最佳的方式是拖拽参数变量到类Excel的电脑表格中,毕竟办公人使用最多的就是Excel。最后选择了x-spreadsheet,使用的是原生的HTML5拖拽API。

预览地址: https://codepen.io/hlmcdh2023/pen/yLGgajp

页面代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>x-data-spreadsheet电子表格</title>
  <link rel="stylesheet" href="https://unpkg.com/x-data-spreadsheet@1.1.9/dist/xspreadsheet.css">
  <script src="https://unpkg.com/x-data-spreadsheet@1.1.9/dist/xspreadsheet.js"></script>
  <script src="https://unpkg.com/x-data-spreadsheet@1.1.9/dist/locale/zh-cn.js"></script>
  <style type="text/css">
    .uni-flex {
      display: flex;
      flex-direction: row;
    }
    .uni-flex-item {
      flex: 1;
    }
    .menu-item {
      width: 200px;
    }
    .border-gray {
      border: solid 1px #DEDEDE;
    }
  </style>
</head>
<body>
<div class="uni-flex">
  <div class="menu-item">
    <ul>
      <li draggable="true" id='name'><span>【姓名】</span></li>
    </ul>
  </div>
  <div class="uni-flex-item border-gray" id="x-spreadsheet-demo"></div>
</div>
<script>
document.addEventListener('DOMContentLoaded', (evtAll) => {
  x_spreadsheet.locale('zh-cn');
  const xs = new x_spreadsheet("#x-spreadsheet-demo", {
    mode: 'edit', // edit | read
    showToolbar: true,
    showGrid: true,
    showContextmenu: true,
    view: {
      height: () => document.documentElement.clientHeight,
      width: () => document.documentElement.clientWidth - 200,
    },
    row: {
      len: 100,
      height: 25,
    },
    col: {
      len: 26,
      width: 100,
      indexWidth: 60,
      minWidth: 60,
    },
    style: {
      bgcolor: '#ffffff',
      align: 'left',
      valign: 'middle',
      textwrap: false,
      strike: false,
      underline: false,
      color: '#0a0a0a',
      font: {
        name: 'Helvetica',
        size: 10,
        bold: false,
        italic: false,
      },
    },
  })
  .loadData({}) // load data
  .change(data => {
    // save data to db
  });
 
  // data validation
  xs.validate();
 
  // 测试xs的方法
  setTimeout(() => {
    console.log('xs.data:', xs.sheet.data.getCellRectByXY(550, 310));
  }, 2000);
 
  function onSelected(event) {
    // event.target.style = 'background-color: blue';
    console.log('xxx')
  }
 
  document.getElementById('name').addEventListener('click', onSelected, false);
 
  /**
   * 拖拽开始
   * @param {DragEvent} event事件对象
   *
  */
  function onDragStart(event) {
    if(!event.target || !event.dataTransfer) {
      return;
    }
    let text = event.target.innerText;
    let children = event.target.children[0].innerText;
    console.log('from text:', text, 'children:', children);
    // 传送的数据
    event.dataTransfer.setData('key', 'name');
    // 传送的数据
    event.dataTransfer.setData('value', text);
  }


  document.getElementById('name').addEventListener('dragstart', onDragStart, false);


  // 拖动事件
  function onDragOver(event) {
    event.stopPropagation();
    event.preventDefault();
  }
 
  // 松开拖放
  function onDrop(event) {
    event.stopPropagation();
    event.preventDefault();
 
    const target = event.currentTarget;
    if(!target || !event.dataTransfer) {
      return;
    }
 
    let key = event.dataTransfer.getData('key');
    let value = event.dataTransfer.getData('value');
    // 目标位置
    var targetPosition = getTargetPosition(event);
    /**
     * 通过鼠标目标位置的x、y坐标,获取所在的行下表、列下标
     * ri 行下标
     * ci 列下标
     */
    const { ri, ci } = xs.sheet.data.getCellRectByXY(targetPosition.x, targetPosition.y);
    xs.cellText(ri, ci, `${key}:${value}`).reRender();
  }
 
  // 监听事件
  document.getElementById('x-spreadsheet-demo').addEventListener('dragover', onDragOver, false);
  document.getElementById('x-spreadsheet-demo').addEventListener('drop', onDrop, false);
 
  // 获取拖拽松开鼠标时,目标位置的x、y坐标
  function getTargetPosition(event) {
    const canvas = document.querySelector('.x-spreadsheet-table');
    const x = event.pageX - canvas.getBoundingClientRect().left;
    const y = event.pageY - canvas.getBoundingClientRect().top;
    return { x: x, y: y };
  }
 
});
</script>
</body>
</html>

该文章在 2024/6/11 16:10:01 编辑过
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved