VUE2导出el-table数据为excel并且按字段分多个sheet

首先在根目录下建一个文件夹export用来存储export.js

复制代码
import * as XLSX from 'xlsx'

function autoWidthFunc(ws, data) {
  // 设置每列的最大宽度
  const colWidth = data.map(row => row.map(val => {
    var reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g') // 检测字符串是否包含汉字
    if (val == null) {
      return { wch: 10 }
    } else if (reg.test(val)) {
      return { wch: val.toString().length * 2 }
    } else {
      return { wch: val.toString().length }
    }
  }))
  // 初始化第一行的列宽
  const result = colWidth[0]
  for (let i = 1; i < colWidth.length; i++) {
    for (let j = 0; j < colWidth[i].length; j++) {
      if (result[j].wch < colWidth[i][j].wch) {
        result[j].wch = colWidth[i][j].wch
      }
    }
  }
  ws['!cols'] = result
}

function jsonToArray(key, jsonData) {
  return jsonData.map(v => key.map(j => v[j]))
}

// 新增:按指定字段分组
function groupByField(data, field) {
  const groupedData = {}
  data.forEach(item => {
    const fieldValue = item[field] || '未分类' // 如果字段值为空,默认归为 "未分类"
    if (!groupedData[fieldValue]) {
      groupedData[fieldValue] = []
    }
    groupedData[fieldValue].push(item)
  })
  return groupedData
}

const exportArrayToExcel = ({ key, data, title, filename, autoWidth, groupBy }) => {
  const wb = XLSX.utils.book_new()

  // 按指定字段分组
  const groupedData = groupByField(data, groupBy)

  // 遍历分组数据,为每个分组创建一个 sheet
  Object.keys(groupedData).forEach(groupName => {
    const arr = jsonToArray(key, groupedData[groupName])
    arr.unshift(title) // 添加标题行
    const ws = XLSX.utils.aoa_to_sheet(arr)

    if (autoWidth) {
      autoWidthFunc(ws, arr)
    }

    // 将 sheet 添加到工作簿中,sheet 名称为分组字段值
    XLSX.utils.book_append_sheet(wb, ws, groupName)
  })

  // 导出 Excel 文件
  XLSX.writeFile(wb, filename + '.xlsx')
}

export default {
  exportArrayToExcel
}

在页面中引入使用

复制代码
import excel from '../../export/export'


 exportExcel() {
      const params = {
        title: ['入库单号', '物料编码', '物料名称', '供应商代码', '生产日期', '批次信息', '单托重量', '入库时间'], // 表格title
        key: ['WarehouseEntryNnumber', 'MaterialCode', 'MaterialName', 'SupplierCode', 'DateofManufacture', 'DatchInformation', 'SingleTowingWeight', 'StorageTime'], // prop绑定的键值
        data: this.tableData, // 数据源
        autoWidth: true, // autoWidth等于true,那么列的宽度会适应那一列最长的值
        filename: '入库管理',
        groupBy: 'MaterialName' // 指定分组字段 根据MaterialName来区分sheet
      }
      excel.exportArrayToExcel(params)
      this.$message({
        message: '请稍等,正在导出为excel表格',
        type: 'success'
      })
    },

导出结果:

相关推荐
YuJie8 小时前
JSBridge 基础知识
前端·javascript
默_笙8 小时前
🍕 后端接口还没写好,前端已经跑起来了?Mock 数据 + axios 接口层,前后端再也不互相"等"
前端·javascript
爱勇宝8 小时前
客户只想看个页面,我却做了一个静态演示发布系统
前端·javascript·后端
Python私教11 小时前
Excel 和群聊什么时候该升级成管理系统?7 个判断信号
excel·管理系统·权限设计
界面开发小八哥12 小时前
界面控件DevExpress Blazor v26.1新版亮点 - Navigation(导航)
javascript·.net·界面控件·blazor·devexpress·ui开发
AI英德西牛仔12 小时前
Claude导出word指令的PC端最优解:AI导出鸭电脑版底层逻辑全拆解
人工智能·word·excel·deepseek·ai导出鸭
SendTomo13 小时前
send.wang(私传网)基于网页P2P直连传输大文件的优势
javascript·网络·webrtc·html5·p2p
toooooop813 小时前
踩坑:PHP7.2导出Excel正常,升级7.3文件损坏需修复
android·excel
学习星球13 小时前
Astro 全栈实战:拆解 RealWorld 项目
前端·javascript·架构·系统架构·前端框架·c5全栈
尚可签14 小时前
基于 Spring Boot + Vue 的 AI 智能在线订餐系统
vue.js·人工智能·spring boot