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'
      })
    },

导出结果:

<think>好的,我现在需要帮用户解决在Vue3中实现数据导出的问题。首先,用户提到了之前看到的引用内容,特别是关于vue-element-admin中的Excel导入导出组件,以及Vue3中使用xlsx库的例子。我得先理清楚这些信息。 用户的需求很明确,就是在Vue3中实现数据导出功能。根据引用中的内容,xlsx库是一个可行的选择。引用[2]中的示例代码展示了如何使用xlsx库将el-table数据导出Excel文件。我需要确认这个方案在Vue3中的适用性,并考虑是否有其他可能的插件或方法。 接下来,我需要考虑用户可能需要的具体步骤。首先,安装xlsx库是基础步骤。然后,如何在Vue3组件中引入和使用这个库?引用[2]中的代码使用了ref来获取表格的DOM元素,然后调用table_to_book方法生成工作簿,最后写入文件。这看起来是可行的,但可能需要根据用户的具体组件结构进行调整,比如确保表格的引用正确。 另外,用户可能还需要处理一些特殊情况,比如动态文件名、大量数据导出,或者自定义数据格式。这时候可能需要更复杂的逻辑,比如批次处理数据或使用xlsx的API来构建工作表。例如,如果数据量很大,直接转换整个表格可能会导致性能问题,所以导出或后端生成文件可能更好。 还需要考虑是否有其他插件可用,比如vue3-json-excel,它可能提供更简便的封装,但需要评估其兼容性和维护状态。引用中提到的vue-element-admin的组件可能需要用户自己迁移到Vue3,这可能涉及一些调整,特别是如果原组件是为Vue2设计的。 最后,用户可能关心的还有错误处理和样式问题。例如,如何处理导出时的异常,或者如何调整导出Excel的样式。这时候可能需要更深入地使用xlsx的配置选项,或者添加额外的处理步骤。 总结一下,我需要提供一个基于xlsx库的基础实现步骤,并提到可能的优化方法和替代方案,确保用户有全面的了解。同时,要提醒注意事项,比如数据量处理和样式调整,帮助用户避免常见问题。</think>### Vue3中实现数据导出的方案 在Vue3中实现数据导出功能,主要有以下两种主流方案: #### 方案一:使用xlsx库(基础方案) 1. **安装依赖** ```bash npm install xlsx ``` 2. **基础实现代码** ```vue <template> <el-table ref="exportTable" :data="tableData"> <!-- 列定义 --> </el-table> <el-button @click="exportToExcel">导出Excel</el-button> </template> <script setup> import { ref } from 'vue' import * as XLSX from 'xlsx' const exportTable = ref(null) const tableData = ref([/* 数据源 */]) const exportToExcel = () => { const tableDom = exportTable.value?.$el.querySelector('.el-table__body-wrapper table') if (!tableDom) return const wb = XLSX.utils.table_to_book(tableDom) XLSX.writeFile(wb, `数据_${new Date().toLocaleDateString()}.xlsx`) } </script> ``` 该方案直接读取DOM表格内容生成Excel文件,适合简单表格导出[^2]。 #### 方案二:使用vue3-json-excel插件(推荐方案) 1. **安装插件** ```bash npm install vue3-json-excel ``` 2. **组件化使用** ```vue <template> <download-excel :data="tableData" :fields="columnsMapping" name="导出数据.xls" > <el-button>导出Excel</el-button> </download-excel> </template> <script setup> import { DownloadExcel } from 'vue3-json-excel' const columnsMapping = { '姓名': 'name', '年龄': 'age' } </script> ``` 该插件支持自定义字段映射和格式转换,适合复杂数据结构[^1]。 #### 高级优化技巧 1. **大数据导出** ```javascript const exportChunk = async () => { let page = 1 const wb = XLSX.utils.book_new() while (true) { const res = await fetchData(page) if (!res.data.length) break const ws = XLSX.utils.json_to_sheet(res.data) XLSX.utils.book_append_sheet(wb, ws, `第${page}页`) page++ } XLSX.writeFile(wb, '数据.xlsx') } ``` 2. **自定义样式配置** ```javascript const ws = XLSX.utils.aoa_to_sheet([ ['标题', { v: '特殊内容', s: { font: { bold: true, color: { rgb: "FF0000" } } } }], ['数据1', '数据2'] ]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值