纯前端导出xlsx文件

纯前端导出xlsx文件

1.utile文件中新建downloadXlsx.js

import xlsx from "xlsx"  //版本 "xlsx": "^0.14.5"
import xlsxStyle from "xlsx-style" // "xlsx-style": "^0.8.13"
 
export function downloadXlsx (fileName = '', dataTable = [], colsWpxList = [], titleObj = {}, titleStyleObj = {}, mergesList = []) {
  //生成表格
  var sheet = xlsx.utils.json_to_sheet(dataTable);
  var tmpdata = xlsx.utils.sheet_add_json(sheet, dataTable, { origin: "A2" });
  // 设置每个单元格宽度
  tmpdata["!cols"] = colsWpxList
  //给A1单元格赋值
  tmpdata["A1"] = titleObj
  // 设置A1标题字体样式
  tmpdata["A1"].s = titleStyleObj
  //单元格合并
  tmpdata["!merges"] = mergesList
  openDownloadDialog(sheet2blob(tmpdata), `${fileName}.xlsx`);
}
 
function sheet2blob(sheet, sheetName) {
  sheetName = sheetName || 'sheet1';
  var workbook = {
    SheetNames: [sheetName],
    Sheets: {},
  };
  workbook.Sheets[sheetName] = sheet; // 生成excel的配置项
 
  var wopts = {
    bookType: 'xlsx', // 要生成的文件类型
    bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
    type: 'binary'
  };
  var wbout = xlsxStyle.write(workbook, wopts);
  var blob = new Blob([s2ab(wbout)], {
    type: "application/octet-stream"
  }); // 字符串转ArrayBuffer
  function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
  }
  return blob;
}
 
function openDownloadDialog(url, saveName) {
  let href = URL.createObjectURL(url)
  let a = document.createElement('a');
  a.href = href;
  a.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
  document.body.appendChild(a)
  a.click()
  document.body.removeChild(a)
  setTimeout(() => {
    URL.revokeObjectURL(url)
  }, 200);
}

2.使用

timeSlotResult (result) {
      const loading = this.$loading({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
      if (result) {
        this.exportTrackData // 导出的table数据
        let fieldKeys = ['currTime', 'lineName', 'lineType', 'busName', 'drvName', 'busStateDesc', 'busSpeed', 'currMile', 'staName']
        let fieldLabels = ['时间', '线路', '上下行', '车牌号/自编号', '司机', '状态', '速度(km/h)', '里程(km)', '位置']
        let fileName = `${this.exportTrackParams.busName}在${this.exportTrackParams.startTime}至${this.exportTrackParams.endTime}轨迹回放数据统计`
        let dataTable = []
        for (let i in this.exportTrackData) {
          let obj = {
            '时间': this.exportTrackData[i].currTime ? this.exportTrackData[i].currTime : '',
            '线路': this.exportTrackData[i].lineName ? this.exportTrackData[i].lineName : '',
            '上下行': this.exportTrackData[i].lineType ?  this.exportTrackData[i].lineType : '',
            '车牌号/自编号': this.exportTrackData[i].busName ? this.exportTrackData[i].busName : '',
            '司机': this.exportTrackData[i].drvName ? this.exportTrackData[i].drvName : '',
            '状态': this.exportTrackData[i].busStateDesc ? this.exportTrackData[i].busStateDesc : '',
            '速度(km/h)': this.exportTrackData[i].busSpeed ? this.exportTrackData[i].busSpeed : '',
            '里程(km)': this.exportTrackData[i].currMile ? this.exportTrackData[i].currMile : '',
            '位置': this.exportTrackData[i].staName ? this.exportTrackData[i].staName : '',
          }
          dataTable.push(obj);
        }
        let colsWpxList = [
          { wpx: 150 }, 
          { wpx: 120 }, 
          { wpx: 120 }, 
          { wpx: 150 }, 
          { wpx: 120 }, 
          { wpx: 120 }, 
          { wpx: 120 }, 
          { wpx: 120 },
          { wpx: 120 },
        ]
        let titleObj = {
          t: "s",
          v: fileName
        }
        let titleStyleObj = {
          font: {
            name: '宋体',
            sz: 20,
            bold: true,
          },
          alignment: {
            horizontal: "center",
            vertical: "center",
            wrap_text: true
          },
        }
        let mergesList = [
          {
            //合并单元格 index都从0开始
            s: { // start 开始
              c: 0, //开始列
              r: 0 //开始行
            },
            e: { // end 结束
              c: fieldKeys.length - 1, //结束列
              r: 0 //结束行
            }
          }
        ]
        downloadXlsx (fileName, dataTable, colsWpxList, titleObj, titleStyleObj, mergesList)
      }
      loading.close()
    }

在这里插入图片描述

注意: 需要在webpack配置 ① 或者vue.config.js中配置 ②


externals: {
‘./cptable’: ‘var cptable’
}

configureWebpack: {
externals: [{
‘./cptable’: ‘var cptable’
}]
},

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue前端中,你可以使用xlsx库来实现导出.xlsx文件的功能。首先,你需要安装xlsx库的依赖。然后,你可以创建一个导出函数,该函数将数据转换为Excel文件,然后下载到用户的设备上。下面是一个示例代码: 1. 首先,安装xlsx库的依赖。 2. 接下来,你需要在你的Vue组件中引入xlsx库。 3. 创建一个导出函数,该函数将数据转换为Excel文件。 4. 在该函数中,你可以使用xlsx库的方法来创建一个工作簿,并向工作簿中添加数据。 5. 最后,使用Blob对象将工作簿转化为.xlsx文件,并提供下载链接给用户。 以下是示例代码: ```javascript // 引入xlsx库 import XLSX from 'xlsx'; // 导出函数 export function exportExcel(data) { const workbook = XLSX.utils.book_new(); // 创建一个工作簿 const worksheet = XLSX.utils.json_to_sheet(data); // 将数据转换为工作表 XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 将工作表添加到工作簿 const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); // 将工作簿转换为二进制数据 const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); // 创建Blob对象 const url = window.URL.createObjectURL(blob); // 创建下载链接 const link = document.createElement('a'); link.href = url; link.download = 'data.xlsx'; // 下载文件的名称 link.click(); // 触发点击下载 } ``` 你可以在需要导出.xlsx文件的地方调用这个导出函数,将需要导出的数据作为参数传递进去,然后就可以实现Vue前端导出.xlsx文件的功能了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [VUE-如何实现前端导出Excel文件](https://blog.csdn.net/the_renaissance/article/details/97127866)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue项目中前端Excel文件(.xlsx)的导入导出](https://blog.csdn.net/cwq521o/article/details/117789745)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值