vue3项目,批量上传excel文件,然后读取excel中内容

vue3项目,批量上传excel文件,然后读取excel中内容

// 读入excel
const readXLSX = (file: any) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.readAsBinaryString(file)
    reader.onload = (evt: any) => {
      const data = evt.target.result
      const wb = XLSX.read(data, { type: 'binary' })
      const jsonData = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {
        header: ['index', 'group', 'answer', 'questions', 'resources']
      })
      jsonData.splice(0, 2) //删除表头
      resolve(jsonData)
    }
  })
}
  1. 函数定义readXLSX 函数接收一个参数 file,这个参数代表要读取的 Excel 文件。

  2. 返回 Promise:函数返回一个新的 Promise 对象,这使得函数可以异步执行并处理完成后的结果。

  3. 创建 FileReader 对象:创建一个 FileReader 对象,用于读取文件内容。

  4. 读取文件:使用 readAsBinaryString 方法读取文件,这会将文件内容作为二进制字符串读入。

  5. 处理文件加载事件:当文件加载完成时,触发 onload 事件。

  6. 解析 Excel 文件:在事件处理函数中,使用 XLSX.read 方法读取二进制字符串,将其解析为 Excel 工作簿对象 wb

  7. 转换为 JSON 格式:使用 XLSX.utils.sheet_to_json 方法将工作簿的第一个工作表转换为 JSON 对象 jsonData。这里指定了 header 选项,定义了 JSON 对象的键名。

  8. 删除表头:使用 splice 方法删除 JSON 数组的前两个元素,这通常是 Excel 文件的表头部分。

  9. 解析 Promise:调用 resolve 函数,将处理后的 JSON 数据作为 Promise 的结果。

这个函数主要用于读取 Excel 文件并将其内容转换为程序可以处理的 JSON 格式,以便进行后续的数据操作。

完整代码:

上传区域:使用 <el-upload> 组件创建了一个文件上传区域,允许用户选择文件,但限制了最大文件数量,并指定了接受的文件类型为 .xlsx 格式的 Excel 文件。

<template>
  <div class="upload-demo">
    <el-upload
      ref="upload"
      v-model="fileList"
      :multiple="multiple"
      :limit="max"
      accept=".xlsx"
      :auto-upload="autoUpload"
      :show-file-list="showFileList"
      :drag="drag"
      :on-exceed="handleExceed"
      :before-upload="handleUpload"
    >
      <div class="uploadText">
        <img src="@/assets/icons/upload.svg" alt="" />
        <div class="text mt-2">先下载模版后再 <span>点击上传</span></div>
      </div>
    </el-upload>
    <!-- <el-button type="primary" @click="changeFlie"> 确认 </el-button> -->
  </div>
</template>

<script setup lang="ts">
import { ref, defineProps, toRefs } from 'vue'
import { UploadFilled } from '@element-plus/icons-vue'
import { fetchAPIGets, fetchAPIPuts, fetchPostAPI } from '@/utils/https.js'
import { ElMessage } from 'element-plus'
import * as XLSX from 'xlsx'

const upload = ref()
// const objData = ref(null)
const fileList = ref([])
const props = defineProps({
  multiple: {
    type: Boolean,
    default: false
  },
  autoUpload: {
    type: Boolean,
    default: true
  },
  showFileList: {
    type: Boolean,
    default: true
  },
  max: {
    type: Number,
    default: 1
  },
  drag: {
    type: Boolean,
    default: false
  }
})

const { multiple, autoUpload, showFileList, max, drag } = toRefs(props)

const handleExceed = (files, fileList) => {
  console.warn(
    `当前限制选择 ${max.value} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`
  )
}

// 读入excel
const readXLSX = (file: any) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.readAsBinaryString(file)
    reader.onload = (evt: any) => {
      const data = evt.target.result
      const wb = XLSX.read(data, { type: 'binary' })
      const jsonData = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {
        header: ['index', 'group', 'answer', 'questions', 'resources']
      })
      jsonData.splice(0, 2) //删除表头
      resolve(jsonData)
    }
  })
}
// 上传文件
const handleUpload = (file: any) => {
  // 检查文件大小是否超过1MB
  const isSizeValid = file.size <= 1024 * 1024 // 1MB in bytes
  if (!isSizeValid) {
    ElMessage.error('文件大小不能超过1MB!')
    return // 阻止超过1MB的文件上传
  }
  //读取excel文件
  readXLSX(file).then((res: any) => {
    // 过滤掉空数据
    let data = res.filter((item: any) => {
      return Object.keys(item).length >= 3
    })
    data = data.map((item: any) => {
      // questions 用换行符分割
      item['questions'] = item['questions']?.split(/\r\n|\r|\n/) || []
      // 过滤掉数组中的空字符串
      item['questions'] = item['questions'].filter((str: string) => str.trim() !== '')
      return {
        questions: item['questions'],
        answer: item['answer'],
        group: item['group'] ? item['group'] : '',
        resources: item['resources'] ? JSON.parse(item['resources']) : []
      }
    })
    console.log(data)
  })
}
const changeFlie = () => {
  // 手动触发上传
  upload.value.submit()
}
</script>

<style scoped lang="scss">
.upload-demo {
  /* 可以添加自定义样式 */
  width: 336px;
  height: 320px;
  border-radius: 12px;
  .uploadText {
    width: 336px;
    height: 320px;
    margin: 100px auto;
    text-align: center;
    .text {
      font-size: 14px;
      span {
        color: #3283ff;
      }
    }
    img {
      width: 54px;
      height: 54px;
      margin: 0px auto;
    }
  }
}
</style>

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下步骤来实现VueExcel文件批量导入: 1. 安装所需依赖:首先,你需要安装`xlsx`和`file-saver`这两个库。可以使用以下命令进行安装: ``` npm install xlsx file-saver ``` 2. 创建一个文件上传的组件:在Vue项目,你可以创建一个文件上传的组件,用于选择和上传Excel文件。可以使用`<input type="file">`元素来实现文件选择功能。 3. 处理Excel文件:一旦用户选择了要上传Excel文件,你可以使用`xlsx`库来处理该文件。首先,你需要在组件引入`xlsx`: ```javascript import XLSX from 'xlsx'; ``` 然后,在文件上传的方法,你可以使用以下代码来读取Excel文件: ```javascript handleFileUpload(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); // 处理Excel数据 // ... }; reader.readAsArrayBuffer(file); } ``` 4. 处理Excel数据:一旦成功读取Excel文件,你可以使用`xlsx`库提供的方法来解析和处理数据。根据你的需求,你可以遍历工作簿的每个表格,并将数据保存到Vue组件的数据,或者执行其他操作。 5. 可选:导出处理后的数据:如果需要,你还可以使用`file-saver`库来导出处理后的数据为Excel文件。你可以使用以下代码来导出数据: ```javascript import { saveAs } from 'file-saver'; // ... // 导出数据为Excel文件 const worksheet = XLSX.utils.json_to_sheet(data); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet 1'); const excelData = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const excelFile = new Blob([excelData], { type: 'application/octet-stream' }); saveAs(excelFile, 'output.xlsx'); ``` 这就是使用Vue实现Excel文件批量导入的基本步骤。根据你的具体需求,你可能需要进一步处理数据、验证数据等。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值