前端导入Excel表格获取数据(Vue3+TS+Element)

<template>
  <el-upload
    ref="upload"
    class="upload-demo"
    :limit="1"
    :on-exceed="handleExceed"
    :show-file-list="false"
    action
    accept=".xlsx,.xls"
    :auto-upload="false"
    :on-change="handleChange"
  >
    <template #trigger>
      <el-button type="primary" :icon="Download" plain>导入</el-button>
    </template>
  </el-upload>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { genFileId } from 'element-plus'
import { Download } from '@element-plus/icons-vue'
//excel文件数据解析
import * as XLSX from 'xlsx'
import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'

const upload = ref<UploadInstance>()

const handleExceed: UploadProps['onExceed'] = (files) => {
  upload.value!.clearFiles()
  const file = files[0] as UploadRawFile
  file.uid = genFileId()
  upload.value!.handleStart(file)
}

interface tableConfigType {
  name: {
    text: string
    type: string
  }
  businessName: {
    text: string
    type: string
  }
}

const tableConfig = {
  name: {
    text: '姓名',
    type: 'string'
  },
  businessName: {
    text: '工号',
    type: 'string'
  },
}
// 按照二进制读取文件 excel文件的处理
const readFile = (file: any) => {
  return new Promise((resolve) => {
    const reader = new FileReader()
    reader.readAsBinaryString(file)
    reader.onload = (e: any) => {
      resolve(e.target.result)
    }
  })
}

const handleChange: UploadProps['onChange'] = async (uploadFile) => {
  //这个是上传的文件
  let file = uploadFile.raw
  console.log(uploadFile, 'file')
  //没有文件
  if (!file) return
  //读取file中的数据
  //把文件解析成二进制数据,把二级制数据变成excel表格式的数据
  let data: any = await readFile(file)
  let workbook = XLSX.read(data, { type: 'binary' })
  //拿到第一个sheet表的数据,把第一个表格的数据转换成JSON数据
  const worksheet = workbook.Sheets[workbook.SheetNames[0]]
  data = XLSX.utils.sheet_to_json(worksheet)
  const arr: any[] = []
  data.forEach((item: any) => {
    let obj: any = {}
    for (let key in tableConfig) {
  // 此处keyof是为了解决直接使用key索引会报错问题
      let v = tableConfig[key as keyof tableConfigType]
      v = item[v.text] || ''
      obj[key] = v
    }
    arr.push(obj)
  })
  console.log(arr, '表格数据')
}
</script>

<style lang="scss" scoped>
.el-button {
  font-size: 12px;
  font-weight: 400;
  height: 28px;
  padding: 8px 16px;
  margin-left: 12px;
  --el-color-primary: #37f;
}
.el-button--primary.is-plain {
  --el-color-primary-light-9: #fff;
  --el-color-primary-light-5: var(--defalut--blue);
}
</style>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中使用TypeScript和ElementUI实现导入Excel需要安装xlsx、@types/xlsx和element-ui两个包,可以使用以下命令进行安装: ``` npm install xlsx @types/xlsx element-ui --save ``` 在Vue组件中,可以使用以下代码来读取Excel文件: ```typescript <template> <el-upload class="upload-excel" :show-file-list="false" :on-change="onFileChange" :before-upload="beforeUpload" > <el-button> <i class="el-icon-upload"></i> 选择文件 </el-button> </el-upload> </template> <script lang="ts"> import { defineComponent } from 'vue'; import * as XLSX from 'xlsx'; export default defineComponent({ data() { return { excelData: [] } }, methods: { beforeUpload(file: any) { const fileType = file.type; const validTypes = ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']; if (validTypes.indexOf(fileType) === -1) { this.$message.error('只支持Excel文件'); return false; } return true; }, onFileChange(event: any) { const file = event.file.raw; const reader = new FileReader(); reader.onload = (event: any) => { const data = new Uint8Array(event.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const excelData = XLSX.utils.sheet_to_json(sheet, { header: 1 }); this.excelData = excelData; this.$message.success('文件上传成功'); }; reader.readAsArrayBuffer(file); } } }); </script> ``` 在模板中,使用ElementUI的`<el-upload>`组件来实现文件上传。在`beforeUpload`方法中判断文件类型,只允许上传Excel文件。在`onFileChange`方法中读取Excel文件,并将数据存储在`excelData`中,并使用`this.$message.success`来提示上传成功。 注意:在使用TypeScript的时候,需要对组件中的方法、参数、返回值进行类型定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值