【vue3】:Excel导入导出解决方案

本文介绍了在Vue3中实现Excel导入导出的方法,包括点击按钮上传和拖拽文件上传两种方式,详细讲解了文件信息获取、解析及数据结构生成的过程,并提到了导出时使用file-saver库将json转换为二维数组的技巧。
摘要由CSDN通过智能技术生成

# Excel 导入导出

# 导入

方式一:点击按钮,选中文件,进行上传

方式二:拖拽文件进行上传

两者的实现步骤如下:

  • 获取文件信息

  • 解析文件(核心)npm i xlsx@0.17.0

  • 生成数据结构,发送给后端


方式一:点击按钮,选中文件,进行上传

工具函数

// 获取表头(通用方式)
export const getHeaderRow = sheet => {
   
  const headers = []
  const range = XLSX.utils.decode_range(sheet['!ref'])
  let C
  const R = range.s.r
  /* start in the first row */
  for (C = range.s.c; C <= range.e.c; ++C) {
   
    /* walk every column in the range */
    const cell = sheet[XLSX.utils.encode_cell({
    c: C, r: R })]
    /* find the cell in the first row */
    let hdr = 'UNKNOWN ' + C // <-- replace with your desired default
    if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
    headers.push(hdr)
  }
  return headers
}

export const USER_RELATIONS = {
   
  姓名: 'username',
  联系方式: 'mobile',
  角色: 'role',
  开通时间: 'openTime'
}

// 数据处理
const generateData = results => {
   
  const arr = []
  results.forEach(item => {
   
    const userInfo = {
   }

    Object.keys(item).forEach(key => {
   
      if (USER_RELATIONS[key] === 'openTime') {
   
        userInfo[USER_RELATIONS[key]] = formatDate(item[key])
        return
      }
      userInfo[USER_RELATIONS[key]] = item[key]
    })
    arr.push(userInfo)
  })
  return arr
}
 <el-button :loading="loading" type="primary" @click="handleUpload"></el-button>
 <input ref="excelUploadInput" type="file" accept=".xlsx, .xls" @change="handleChange"/>
<script setup>
import XLSX from 'xlsx'    
const excelUploadInput = ref(null)
const handleUpload = () => {
  excelUploadInput.value.click()
}

const handleChange = (e) => {
  const files = e.target.files
  const rawFile = files[0]
  if (!rawFile) return
  upload(rawFile)
}

// 触发上传事件
const upload = rawFile => {
 // 读取文件(异步)
 return new Promise((resolve, reject) => {
    const reader = new FileReader()
    // 该事件在读取操作完成时触发
    reader.onload = e => {
      // 1. 获取解析到的数据
      const data = e.target.result
      // 2. 利用 XLSX 对数据进行解析
      const workbook = XLSX.read(data, { type: 'array' })
      // 3. 获取第一张表格(工作簿)名称
      const firstSheetName = workbook.SheetNames[0]
      // 4. 只读取 Sheet1(第一张表格)的数据
      const worksheet = workbook.Sheets[firstSheetName]
      // 5. 解析数据表头
      const header = getHeaderRow(worksheet)
      // 6. 解析数据体
      const results = XLSX.utils.sheet_to_json(worksheet)
      // 7. 传入解析之后的数据
      generateData({ header, results })
      // 8. 异步完成
      resolve()
    }
    // 启动读取指定的 Blob 或 File 内容
    reader.readAsArrayBuffer(rawFile)
  })   
}
const generateData = ({ header, results }) => {
  const updateData = generateData(results)
  // 将数据发送给后端进行存储
}
</script>

方法二:拖拽文件进行上传

拖拽主要是实现一个拖拽的一个过程&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海面有风

您的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值