首页

源码搜藏网

首页 > 开发教程 > js/jQuery教程 >

使用vue导出excel遇到的坑及解决

创建时间:2022-04-07 12:37  

vue导出excel遇到的坑

需求

Vue+element UI el-table下的导出当前所有数据到一个excel文件里。

先按照网上的方法,看看有哪些坑

准备工作

1、安装依赖:yarn add xlsx file-saver -S

2、在放置需要导出功能的组件中引入

import FileSaver from "file-saver";
import XLSX from "xlsx";

3、HTML中的设置,简单来说就是给需要导出的table标签el-table上加一个id:如outTable,对应下面的exportExcel方法中的 document.querySelector(‘#outTable‘)

   //导出当前表格
exportCurrent:function(){
  var wb = XLSX.utils.table_to_book(document.querySelector('#outTable')) //表格id
  var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
  try {
    FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), 'sheet.xlsx') //文件名
  } catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
  return wbout
},

我们来看一下原始数据

使用vue导出excel遇到的坑及解决

接下来再来看一下导出的结果

使用vue导出excel遇到的坑及解决

哎???我订单编号跟银行卡号咋成了科学计数法了??

还有我的时间,时分秒呢??

原因是因为数字太长了,需要使用excel的文本格式才能显示正常

经过各种搜索,最终解决方法如下:

exportExcel() {
   var xlsxParam = { raw: true };//转换成excel时,使用原始的格式
   var wb = XLSX.utils.table_to_book(document.querySelector("#outTable"),xlsxParam);
   var wbout = XLSX.write(wb, {
    bookType: "xlsx",
    bookSST: true,
    type: "array"
   });
   try {
    FileSaver.saveAs(
     new Blob([wbout], { type: "application/octet-stream;charset=utf-8" }),
     "sheetjs.xlsx"
    );
   } catch (e) {
    if (typeof console !== "undefined") console.log(e, wbout);
   }
   return wbout;
  },

再来看我们的数据

使用vue导出excel遇到的坑及解决

大功告成。

vue导出excel表报错处理

Excel表导出功能需要将请求中的 responseType 设置为 blob,也就是说请求只能接收Excel文件,json数据没法处理

此时可以根据 Response 的 Content-Type值类判断处理,如果值 为 application/json,则先将返回的数据转换成字符串,然后再转换为 JSON

        // 导出
        downLoad(){
            const fileReader = new FileReader() // 第一步创建文件对象
            const loading = this.$loading({
                lock: true,
                text: '导出加载中···',
                spinner: 'el-icon-loading',
                background: 'rgba(0, 0, 0, 0.7)'
            });
            const data = {
                equipmentName: this.searchForm.equipmentName,
                equipmentCode: this.searchForm.equipmentCode,
            };
            download('/api/mfg-mes/equipmentVersion/exportStandardWorkTime', data).then(res => {
                fileReader.onloadend = () => { // 定义方法
                    if (res.type === 'application/json') { // 第三步进行判断
                        const jsonData = JSON.parse(fileReader.result) // 说明是普通对象数据,后台转换失败
                        // 后台信息
                        // console.log(jsonData,'fileReader')
                        this.$message.error(jsonData.msg)
                        loading.close();
                    }else{
                        downloadFile(res, '信息表', 'xlsx')
                        loading.close();
                    }
                }
                fileReader.readAsText(res)
            }).catch(err => {
                console.log(err);
            })
        },

以上为个人经验,希望能给大家一个参考,也希望大家多多支持源码搜藏网。

上一篇:JS实现电影票选座的项目示范例子
下一篇:没有了

相关内容

热门推荐