表格数据导出为Excel

环境及插件配置:(理论上vue2应该也可以使用,没有试验过)

javascript 复制代码
"vue": "^3.2.36",
"webpack": "^5.94.0",
"webpack-cli": "^5.1.4",
"file-saver": "^2.0.5",
"xlsx": "^0.18.5"

必须安装 file-saver 与 xlsx

该方法中用到了一个判断数据类型的小方法

javascript 复制代码
 * 判断数据类型
 * @param {any} value 
 * @returns {String}
 * 返回数据为:
 * "[object Number]","[object String]","[object Boolean]","[object Date]","[object RegExp]"
 * "[object Object]","[object Array]","[object Function]","[object Null]","[object Undefined]"
 */

function getDataType(value) {
  return Object.prototype.toString.call(value)
}

将table表格导出为Excel

javascript 复制代码
import * as XLSX from 'xlsx'
import { saveAs } from 'file-saver';

function getDataType(value) {
  return Object.prototype.toString.call(value)
}

/**
 * 将table表格导出为Excel
 * @param {Array} tableData 表格数据
 * @param {Array} tableHeader 表格头
 * @param {Object | String} exportConfig 导出的Excel文件配置信息
 * {
 *    width:列宽,可传入list,传入多少列,即可设置多少列 widthList - 前三列:[120,120,120] 默认每一列宽度120
 *    name: 导出文件的名称,默认当前日期 - xxxx年xx月xx日
 * }
 * String - 允许只传入文件名称
 * @param {Object} key 解析数据所需key: label - 表头显示字段 prop - 表格渲染字段
 * @returns {null}
 * 无返回
 */

function exportToExcel(tableData, tableHeader, exportConfig = {
  width: '120',
  widthList: [],
  name: "",
}, key = {
  label: 'label',
  prop: "prop"
}) {
  let exportList = [], // 导出目标
    headerLabelList = [], // 列头label
    headerPropList = [], // 列头prop
    dataList = [], // 数据
    label = key?.label || 'label', // 表格label的key
    prop = key?.prop || "prop"; // 表格prop的key
  tableHeader.forEach(item => {
    headerLabelList.push(item[label])
    headerPropList.push(item[prop])
  })
  tableData.forEach(item => {
    let itemList = []
    headerPropList.forEach(itemProp => {
      itemList.push(item[itemProp])
    })
    dataList.push([...itemList])
  })
  exportList = [headerLabelList, ...dataList]
  // 数据转换工作表
  const worksheet = XLSX.utils.aoa_to_sheet(exportList)
  let wsList = Array(tableHeader.length).fill({ wpx: '120' }) // 导出的Excel列宽
  let exportName = new Date().Format('yyyy-MM-dd') // 导出的文件名称 - 默认当天时间
  if (exportConfig) {
    if (getDataType(exportConfig) == "[object String]") {
      exportName = exportConfig
    } else if (getDataType(exportConfig) == "[object Object]") {
      if (getDataType(exportConfig.widthList) == '[object Array]' && exportConfig.widthList.length) {
        wsList = exportConfig.widthList.map(item => {
          return { wpx: item }
        })
      } else {
        let wpx = '120'
        if (exportConfig.width) {
          wpx = exportConfig.width
        }
        wsList = Array(tableHeader.length).fill({ wpx })
      }
      if (exportConfig?.name) {
        exportName = exportConfig.name
      }
    }
  }
  worksheet['!cols'] = wsList
  // 创建工作簿并添加转换好的工作表
  const workbook = XLSX.utils.book_new()
  XLSX.utils.book_append_sheet(workbook, worksheet, exportName)
  // 生成Excel文件
  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });

  // 使用blob和FileReader创建一个URL然后下载
  const dataBlob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8' });
  saveAs(dataBlob, exportName + '.xlsx')
}

export {
  exportToExcel
}
相关推荐
腻害兔2 分钟前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
whyfail10 分钟前
前端学 Spring Boot(2):一次点击,如何穿过整个后端?
前端·spring boot·后端
AI多Agent协作实战派41 分钟前
AI多Agent协作系统实战(二十三):Agent读HEARTBEAT.md不读AGENTS.md——openclaw的文件加载之谜
前端·数据库·人工智能·uni-app
元Y亨H1 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
gis开发之家1 小时前
《Vue3 从入门到大神37篇》Vue3 源码详解(七):watch 与 watchEffect 源码对比——副作用是如何被追踪的?
javascript·前端框架·vue3·vue3源码
2601_955760072 小时前
如何用 Claude Opus 5 API 批量扩展长尾关键词和文章选题
前端·python·搜索引擎
KaMeidebaby2 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
bloglin999992 小时前
langchain 和 langgraph 和 react
javascript·react.js·langchain
触底反弹2 小时前
🚀 删了数据刷新又回来?3 组件 × 4 回调 × 3 坑讲透 React 父子通信
前端·javascript·react.js
耳东小鹿3 小时前
对象常用方法
前端