Vue3 导入导出Excel

1.需求

  1. 提供一个 Excel 文件,将里面的内容导出成 JSON 数组
  2. 提供一个 JSON 数组,生成 Excel 文件并下载

表格
在这里插入图片描述

2. 实现

1. 安装步骤

npm install xlsx --save

2.使用

import * as XLSX from 'xlsx' // Vue3 版本

3.导出

const ExportXlsx = () => {
  // 创建工作表
  const data = XLSX.utils.json_to_sheet(props.table.tableData)
  // 创建工作簿
  const wb = XLSX.utils.book_new()
  // 将工作表放入工作簿中
  XLSX.utils.book_append_sheet(wb, data, 'data')
  // 生成文件并下载
  XLSX.writeFile(wb, 'test.xlsx')
}

在这里插入图片描述
导出之后发现数据结构不是我们想要的那种,此时就能通过以下方法转换。
在这里插入图片描述

let head = {
  date: '日期',
  name: '姓名',
  address: '地址',
}

const list = props.table.tableData.map(item => {
  const obj = {}
  for (const k in item) {
    if (head[k]) {
      obj[head[k]] = item[k]
    } 
  }
  return obj
})

更改列宽
在这里插入图片描述

4.导入

const ImportXlsx = e => {
  const file = e.target.files[0]
  const reader = new FileReader()
  reader.readAsArrayBuffer(file)
  reader.onload = e => {
    let data = e.target.result
    constworkbook = XLSX.read(data, { type: 'binary', cellDates: true })
    const wsname = workbook.SheetNames[0]
    const outdata = XLSX.utils.sheet_to_json(workbook.Sheets[wsname])
    console.log(outdata);
  }
}

如果excel中含有日期,需要解析时间格式的内容。

在这里插入图片描述
在这里插入图片描述
XLSL.read会默认解析为天数的时间戳字符串(从1900年算起到当前日期的天数)

解决办法:
const workbook = XLSX.read(data, { 
  type: 'binary', 
  cellDates: true  //设为true,将天数的时间戳转为时间格式
})

转换成中国标准时间,我最终想要的是转换成自己想要的时间格式,需要moment工具类

import moment from "moment";

注意的点:xlsx将excel中的时间内容解析后,会小一天 如2020/11/3,xlsx会解析成 Mon Nov 02 2020
23:59:17 GMT+0800 小了43秒 当再用moment转换成日期时: Mon Nov 02 2020 23:59:17
GMT+0800 会转成2020/11/2 所以需要在moment转换后+1天

// 这里我将日期和表格中文转换放在一起处理了
const key = {
  日期: 'date',
  姓名: 'name',
  地址: 'address',
}

const deal = data => {
  data.forEach(item => {
    Object.keys(item).map(keys => {
      let newKey = key[keys]
      if (newKey) {
        item[newKey] = item[keys]
        delete item[keys]
      }
    })
  })
  data.forEach(item => {
    item.date = moment(item.date).add(1, 'd').format('YYYY-MM-DD')
  })
  return data
}

在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Vue中实现上传Excel文件并解析的功能,可以按照以下步骤进行操作: 1. 首先,需要在Vue项目中引入相关的依赖库。可以使用`npm`或`yarn`安装`xlsx`库,该库可以用于解析Excel文件。可以使用以下命令进行安装: ``` npm install xlsx ``` 2. 在Vue组件中,需要添加一个文件上传的`input`元素,用于选择Excel文件。可以使用`v-on:change`事件监听文件选择的变化,并将选择的文件保存到Vue的数据中。 3. 在Vue组件的方法中,可以编写一个函数来处理上传的Excel文件。在该函数中,可以使用`FileReader`对象来读取Excel文件的内容,并将其转换为二进制字符串。 4. 使用`xlsx`库中的`read`函数来解析Excel文件。可以将读取到的二进制字符串传递给`read`函数,并获取到解析后的JavaScript对象。 5. 对解析后的JavaScript对象进行处理,提取需要的数据,并将其展示在前端页面上。可以使用Vue的数据绑定功能,将解析后的数据绑定到页面的Table组件上。 下面是一个示例代码,演示了如何在Vue中实现上传Excel文件并解析的功能: ```vue <template> <div> <input type="file" accept=".xlsx" v-on:change="handleFileUpload"> <table> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>性别</th> </tr> </thead> <tbody> <tr v-for="item in data" :key="item.name"> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <td>{{ item.gender }}</td> </tr> </tbody> </table> </div> </template> <script> import XLSX from 'xlsx'; export default { data() { return { data: \[\] }; }, methods: { 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' }); const sheet = workbook.Sheets\[workbook.SheetNames\[0\]\]; const jsonData = XLSX.utils.sheet_to_json(sheet, { header: 1 }); // 处理解析后的数据 this.data = jsonData.map((row) => ({ name: row\[0\], age: row\[1\], gender: row\[2\] })); }; reader.readAsArrayBuffer(file); } } }; </script> ``` 在上述示例代码中,我们通过`input`元素监听文件选择的变化,并在`handleFileUpload`方法中处理上传的Excel文件。使用`FileReader`对象读取文件内容,并将其转换为二进制字符串。然后,使用`xlsx`库的`read`函数解析Excel文件,并将解析后的数据绑定到Vue的数据中。最后,使用Vue的数据绑定功能将解析后的数据展示在页面的Table组件上。 请注意,上述代码仅为示例,具体的实现方式可能会根据项目的需求和具体情况有所不同。 #### 引用[.reference_title] - *1* *2* *3* [如何使用Vue实现Excel表格数据的导入,在前端实现Excel表格文件的上传和解析,并使用Table组件将解析出来的...](https://blog.csdn.net/qq_43320293/article/details/130542684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值