首页 > 其他分享 >如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴

时间:2025-01-18 21:11:53浏览次数:1  
标签:code name field vxe title Excel 复制粘贴 input true

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴

官网:https://vxetable.cn

<template>
  <div>
    <vxe-grid
      ref="gridRef"
      v-bind="gridOptions"
      @cell-area-selection-end="cellAreaSelectionEndEvent"
      @cell-area-extension-end="cellAreaExtensionEndEvent"
      @clear-cell-area-selection="clearCellAreaSelectionEvent">
      <template #toolbarButtons>
        <span>数据:</span>
        <vxe-select v-model="rowSize" :options="dataOptions" @change="changeRowSizeEvent"></vxe-select>
      </template>

      <template #bottom>
        <div>统计信息:{{ countText }}</div>
      </template>
    </vxe-grid>
  </div>
</template>

<script>
import XEUtils from 'xe-utils'
export default {
  data () {
    const rowSize = 50
    const countText = ''
    const dataOptions = [
      { label: '加载 3 行', value: 3 },
      { label: '加载 20 行', value: 20 },
      { label: '加载 50 行', value: 50 },
      { label: '加载 100 行', value: 100 },
      { label: '加载 500 行', value: 500 },
      { label: '加载 1000 行', value: 1000 },
      { label: '加载 5000 行', value: 5000 },
      { label: '加载 10000 行', value: 10000 },
      { label: '加载 50000 行', value: 50000 }
    ]
    const gridOptions = {
      border: true,
      height: 800,
      showOverflow: true,
      columnConfig: {
        resizable: true,
        width: 160
      },
      rowConfig: {
        keyField: 'id',
        resizable: true
      },
      resizableConfig: {
        isSyncAutoWidth: true,
        isDblclickAutoWidth: true,
        isSyncAutoHeight: true,
        isDblclickAutoHeight: true // 启用双击自适应行高
      },
      exportConfig: {
        types: [
          'xlsx'
        ]
      },
      toolbarConfig: {
        custom: true,
        zoom: true,
        export: true,
        slots: {
          buttons: 'toolbarButtons'
        }
      },
      mouseConfig: {
        area: true // 是否开启区域选取
      },
      areaConfig: {
        multiple: true,
        showColumnStatus: true,
        showRowStatus: true,
        selectCellToRow: true,
        extendByCalc: true,
        extendByCopy: true // 是否启用扩展区域自动填充,当选取一个单元格时,自动将当前内容填充到扩展区域的所有单元格中(同时按住 ctrl 键可取消值自动识别数字功能)
      },
      editConfig: {
        mode: 'cell',
        trigger: 'dblclick' // 双击单元格激活编辑状态
      },
      menuConfig: {
        header: {
          options: [
            // 引入 plugin-menu 扩展插件之后可以直接使用以下内置 code,使用最简单
            [
              { code: 'COPY_TITLE', name: '复制列标题' },
              { code: 'EXPORT_ALL', name: '导出 CSV', prefixIcon: 'vxe-icon-download', params: { filename: '导出数据', type: 'csv' } }
            ]
          ]
        },
        body: {
          options: [
            // 自行自定义 code 的功能,自己实现更灵活
            [
              { code: 'myCode', name: '自定义的菜单' }
            ],
            // 引入 plugin-menu 扩展插件之后可以直接使用以下内置 code,使用最简单
            [
              { code: 'CLEAR_CELL', name: '清除单元格值 (Del)' },
              { code: 'COPY_CELL', name: '页面内复制 (Ctrl+C)', prefixIcon: 'vxe-icon-copy' },
              { code: 'CUT_CELL', name: '页面内剪贴 (Ctrl+X)', prefixIcon: 'vxe-icon-cut' },
              { code: 'PASTE_CELL', name: '页面内粘贴 (Ctrl+V)', prefixIcon: 'vxe-icon-paste' }
            ],
            [
              { code: 'OPEN_FIND', name: '查找 (Ctrl+F)' },
              { code: 'OPEN_REPLACE', name: '替换 (Ctrl+H)' },
              { code: 'MERGE_OR_CLEAR', name: '合并/取消 (Ctrl+M)', prefixIcon: 'vxe-icon-merge-cells' }
            ],
            [
              {
                name: '插入数据',
                children: [
                  { code: 'INSERT_AT_ROW', name: '插入' },
                  { code: 'INSERT_NEXT_AT_ROW', name: '插入 next' },
                  { code: 'INSERT_AT_EDIT_ROW', name: '插入并编辑' },
                  { code: 'INSERT_NEXT_AT_EDIT_ROW', name: '插入并编辑 next' }
                ]
              }
            ],
            [
              {
                name: '删除数据',
                children: [
                  { code: 'DELETE_ROW', name: '删除行' },
                  { code: 'DELETE_AREA_ROW', name: '删除选取范围内的行' },
                  { code: 'DELETE_CHECKBOX_ROW', name: '删除复选框勾选行' }
                ]
              }
            ],
            [
              { code: 'EDIT_CELL', name: '编辑' },
              { code: 'REVERT_CELL', name: '还原值', prefixIcon: 'vxe-icon-repeat' }
            ],
            [
              { code: 'CLEAR_FILTER', name: '清除筛选' },
              { code: 'CLEAR_ALL_FILTER', name: '清除所有筛选' },
              {
                name: '排序',
                children: [
                  { code: 'CLEAR_SORT', name: '清除排序' },
                  { code: 'SORT_ASC', name: '升序', prefixIcon: 'vxe-icon-sort-alpha-asc' },
                  { code: 'SORT_DESC', name: '倒序', prefixIcon: 'vxe-icon-sort-alpha-desc' }
                ]
              }
            ],
            // 引入 plugin-menu 扩展插件之后可以直接使用以下内置 code,使用最简单
            [
              { code: 'PRINT_ALL', name: '打印', prefixIcon: 'vxe-icon-print', params: { columns: ['name', 'role', 'sex', 'num', 'age'] } },
              { code: 'EXPORT_ALL', name: '导出 CSV', prefixIcon: 'vxe-icon-download', params: { filename: '导出数据', type: 'csv' } }
            ]
          ]
        },
        footer: {
          options: [
            [
              { code: 'PRINT_ALL', name: '打印', prefixIcon: 'vxe-icon-print', params: { columns: ['name', 'role', 'sex', 'num', 'age'] } }
            ]
          ]
        }
      },
      keyboardConfig: {
        arrowCursorLock: true,
        isClip: true,
        isArrow: true,
        isShift: true,
        isTab: true,
        isEnter: true,
        isEdit: true,
        isBack: true,
        isDel: true,
        isEsc: true,
        isFNR: true,
        isMerge: true // 是否开启单元格合并功能
      },
      virtualXConfig: {
        enabled: true,
        gt: 0
      },
      virtualYConfig: {
        enabled: true,
        gt: 0
      },
      columns: [
        { field: 'seq', type: 'seq', fixed: 'left', width: 80, rowResize: true },
        { field: 'a', title: 'A', editRender: { name: 'input' } },
        { field: 'b', title: 'B', editRender: { name: 'input' } },
        { field: 'c', title: 'C', editRender: { name: 'input' } },
        { field: 'd', title: 'D', editRender: { name: 'input' } },
        { field: 'e', title: 'E', editRender: { name: 'input' } },
        { field: 'f', title: 'F', editRender: { name: 'input' } },
        { field: 'g', title: 'G', editRender: { name: 'input' } },
        { field: 'h', title: 'H', editRender: { name: 'input' } },
        { field: 'i', title: 'I', editRender: { name: 'input' } },
        { field: 'j', title: 'J', editRender: { name: 'input' } },
        { field: 'k', title: 'K', editRender: { name: 'input' } },
        { field: 'l', title: 'I', editRender: { name: 'input' } },
        { field: 'm', title: 'M', editRender: { name: 'input' } },
        { field: 'n', title: 'N', editRender: { name: 'input' } },
        { field: 'o', title: 'O', editRender: { name: 'input' } },
        { field: 'p', title: 'p', editRender: { name: 'input' } },
        { field: 'q', title: 'Q', editRender: { name: 'input' } }
      ]
    }
    return {
      rowSize,
      countText,
      dataOptions,
      gridOptions
    }
  },
  methods: {
    loadData (size) {
      // 模拟后台接口
      this.gridOptions.loading = true
      setTimeout(async () => {
        const list = []
        for (let i = 0; i < size; i++) {
          const item = {
            id: i + 1,
            a: '9',
            b: '2',
            c: '7',
            d: '6',
            e: '6',
            f: '3',
            g: '5',
            h: '5',
            i: '4',
            j: '0',
            k: '7',
            l: '8',
            m: '8',
            n: '5',
            o: '8',
            p: '1',
            q: '9',
            r: '3',
            s: '4',
            t: '1'
          }
          list.push(item)
        }
        this.gridOptions.loading = false
        const $grid = this.$refs.gridRef
        if ($grid) {
          await $grid.loadData(list)
          this.updateFooterInfo()
        }
      }, 200)
    },
    updateFooterInfo () {
      const $grid = this.$refs.gridRef
      if ($grid) {
        const cellAreas = $grid.getCellAreas() // 获取选取的区域
        const firstItem = cellAreas[0]
        let countNum = 0
        if (firstItem) {
          firstItem.rows.forEach(row => {
            firstItem.cols.forEach(column => {
              const cellValue = row[column.field]
              countNum += XEUtils.toNumber(cellValue)
            })
          })
        }
        this.countText = firstItem ? `当前已选择 ${firstItem.rows.length} 行 ${firstItem.cols.length} 列;合计:${countNum}` : ''
      }
    },
    // 单元格选取结束事件
    cellAreaSelectionEndEvent () {
      this.updateFooterInfo()
    },
    // 单元格扩展结束事件
    cellAreaExtensionEndEvent () {
      this.updateFooterInfo()
    },
    // 点击表格之外选取区域被清除时
    clearCellAreaSelectionEvent () {
      this.updateFooterInfo()
    },
    changeRowSizeEvent () {
      this.loadData(this.rowSize)
    }
  },
  mounted () {
    this.loadData(this.rowSize)
  }
}
</script>

https://gitee.com/x-extends/vxe-table

标签:code,name,field,vxe,title,Excel,复制粘贴,input,true
From: https://www.cnblogs.com/qaz666/p/18678861

相关文章

  • Excel中ACCRINT函数的用法
    Excel中ACCRINT函数的用法1.函数详细讲解1.1函数解释1.2使用格式1.3参数定义1.4要点2.实用演示示例2.1函数需求2.2公式编写2.3计算过程3.注意事项4.文档下载5.其他文章6.获取全部Excel练习素材快来试试吧......
  • Java百万数据导出Excel性能优化[读(并发)写分离/流式查询]
    参考:https://www.zhihu.com/tardis/bd/art/533753443?source_id=1001 Java百万数据导出Excel性能优化[读(并发)写分离/流式查询]结果测试:104万数据,导出excel用时由59秒优化到19秒问题列表:1、导出过程中会较多占用CPU、内存、磁盘,需全局对Excel导出限流,防止同时对大量数......
  • PDF转换:从Word到Excel
    一、引言在数字化的浪潮中,PDF文件格式以其稳定性和兼容性成为了信息交流的宠儿。然而,当我们需要编辑这些PDF文件时,往往会遇到各种难题。今天,我要和大家分享的,是如何将PDF文件轻松转换成Word和Excel格式,让编辑变得轻而易举。二、技术分享首先,让我们揭开PDF转换技术的神秘......
  • pandas读取和写入excel表格
    读取excel表格pandas.read_excel()函数read_excel()函数用于读取Excel文件并将其转换为Pandas的DataFrame对象。这是处理Excel数据的基础。函数原型如下:pandas.read_excel(io, sheet_name=0, *, header=0, names=None, index_col=None, usecols=None, dtype=None, e......
  • C# 获取excel某列单元值的特殊数值处理方式(根据单元数据格式编码获取小位数)
    当excel文件某列单元数值显示的值和实际的值不一致:1.某列某单元显示:38,实际值是38.43,只取显示的38的值。2.某列某单元显示:38.68,实际值是38.685,只取显示的38.68的值。注释:如果没有格式并且不是默认的常规格式,是文本格式时,读取什么值则返回什么值。以下是本人写的公共静态帮助类,可以......
  • 使用excel生成简单的日历
    思路比较简单,样式也单一,丑了点。采用宏和时间函数,计算单元格偏移量,进行单元格填充。SubGenerateYearCalendar()DimwsAsWorksheetSetws=ThisWorkbook.Sheets("Sheet1")'更改为你使用的表名DimyearAsIntegeryear=InputBox("请输入年份(如......
  • vxe-table 实现行高拖拽功能
    vxe-table实现行高拖拽功能,需要注意更新到最新版本才支持该功能官网:https://vxetable.cn通过row-config.resizable和row-resize启用行高拖拽功能;当需要多列允许触发行高拖拽时,通过row-resize指定任意列<template><div><vxe-gridv-bind="gridOptions"></vxe-......
  • 实现类似Excel的筛选
    以下是在DataGridView中实现类似Excel下拉筛选功能的解决方案:解决思路为DataGridView的列添加DataGridViewComboBoxColumn类型的列,用于显示下拉筛选列表。为DataGridView的ColumnHeaderMouseClick事件添加处理程序,当用户点击列头时,显示下拉筛选菜单。根据列的......
  • 技术领先的基于Excel的统计学分析和机器学习软件XLSTAT®
     技术领先的基于Excel的统计学分析和机器学习软件XLSTAT® XLSTAT®是一款强大的Excel数据统计分析和机器学习插件,使您可以在Excel中轻松分析和重新格式化数据。在学术研究和私人企业业务研究中,数据是最为重要的信息来源。无论您所在的专业领域是什么,您需要强大、......
  • (二)C#同一个项目窗体应用程序复制粘贴窗体文件出现各种bug正确解决办法
        事情是这样的,如上图所示,因为一个系统里面有好几个子系统,有些子系统之间的“增删查改”又是相通的,于是想通过复制相同的窗体到另外一个文件夹的时候,如果不正确引用“新项目”将会出现以上各种错误。在网上搜索了各种方式,尝试了各种办法,最后找到下面这种亲测有效的解决......