前端如何下载excel表格

1.1下载表单,需要自己配置,引用别人封装好的ts文件

import { downloadXlsxFile } from "./downloadFile"; //引入自定义xlxs ts

const form = reactive({val:{}})
form.val=res.data.trsCircuit;

 const labelAll = 
    {
        aaddress:'地址',
        abuzPort: "设备端口",
        actnId: "系统ID",
        acustId:'A用户信息'
     }

//下载电路基本信息自定义xlxs
const downloadBasic = () => {
  var data = [form.val];
  var fields = labelAll;
  let filename = "电路基本信息";
  //data表格信息 fields表头 filename文件名
  downloadXlsxFile(data, fields, filename);
};
downloadFile.ts

//装 file-saver 和 xlsx 包
import fs  from 'file-saver'
import  * as XLSX from 'xlsx'
function downloadXlsxFile(dataArray: any, fields: any, filename: string) {
  /**
   * 表格数据 => dataArray=[{id:"1",name:"666",sex:"男"}] 
   * 表格数据的title => fields={id:"id",name:"名字",sex:"性别"}
   * 表格名字 => filename
   */
  var data = JSON.stringify(dataArray);
  var newData = JSON.parse(data);
  newData.forEach((item: any) => {
    if (item) {
      for (let i in item) {
        if (fields.hasOwnProperty(i)) {
          item[fields[i]] = item[i];
        }
        delete item[i]; //删除原先的对象属性
      }
    }

  })
  let sheetName = filename //excel的文件名称
  let wb = XLSX.utils.book_new()  //工作簿对象包含一SheetNames数组,以及一个表对象映射表名称到表对象。XLSX.utils.book_new实用函数创建一个新的工作簿对象。
  let ws = XLSX.utils.json_to_sheet(newData, { header: Object.values(fields) }) //将JS对象数组转换为工作表。
  wb.SheetNames.push(sheetName)
  wb.Sheets[sheetName] = ws
  const defaultCellStyle = { font: { name: "Verdana", sz: 13, color: "FF00FF88" }, fill: { fgColor: { rgb: "FFFFAA00" } } };//设置表格的样式
  let wopts = { bookType: 'xlsx', bookSST: false, type: 'binary', cellStyles: true, defaultCellStyle: defaultCellStyle, showGridLines: false }  //写入的样式
  let wbout = XLSX.write(wb, wopts)
  let blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' })
  fs.saveAs(blob, filename + '.xlsx') 
}
function  s2ab(s) {
  if (typeof ArrayBuffer !== 'undefined') {
    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
  } else {
    var buf = new Array(s.length);
    for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
    return buf;
  }
}
export { downloadXlsxFile };

1.2自己封装下载方法

//装 xlsx 包
import * as XLSX from 'xlsx'
const exportExcelfn=(successData,filename,fileName)=>{
      // 设置表格样式,!cols为列宽
    const options = {
        '!cols': [
            { wpx: 100 },
            { wpx: 100 },
            { wpx: 100 },
            { wpx: 100 },
            { wpx: 100 },
        ]
    }; 
   const successSheet1 = XLSX.utils.json_to_sheet(successData);
   const successSheet2 = XLSX.utils.json_to_sheet(successData);
   // 设置每列的列宽,10代表10个字符,注意中文占2个字符   
   successSheet1 ['!cols']=successSheet2 ['!cols'] = options['!cols']; 

   //创建虚拟工作簿workbook
    const workbook = XLSX.utils.book_new();

   /* 将工作表添加到工作簿,生成xlsx文件(book,sheet数据,sheet命名)*/
   XLSX.utils.book_append_sheet(workbook, successSheet1 , filename);
   XLSX.utils.book_append_sheet(workbook, successSheet2 , filename);

   /* 输出工作表, 由文件名决定的输出格式(book,xlsx文件名称)*/
   XLSX.writeFile(workbook, `${fileName+filename}.xlsx`);
}
const downloadBasic = (fileName) => {
    console.log( form.val)
    let data=form.val;
    const successData = [{
        'ID':data.Id,
        '名称':data.Name,
        '别名':data.alias,
    }];
    exportExcelfn(successData,'文件名',fileName)
}

2. 获取页面中的table元素,下载表格

import FileSaver from "file-saver"; //下载excel
import * as XLSX from "xlsx";

const exportExcel = (el) => {
  var xlsxParam = { raw: true };
  var wb = XLSX.utils.table_to_book(
    document.querySelector("#" + el),
    xlsxParam
  );
  var wbout = XLSX.write(wb, {
    bookType: "xlsx",
    bookSST: true,
    type: "array",
  });
  try {
    FileSaver.saveAs(
      new Blob([wbout], { type: "application/octet-stream" }),
      "详情.xlsx"
    );
  } catch (e) {
    if (typeof console !== "undefined") {
      console.log(e, wbout);
    }
  }
  return wbout;
};
<el-table ref="selfTable">
     <el-table-column prop="province" label="组织机构" align="center" width="150">
          <template slot-scope="scope">
                <div>
                    {{ scope.row.province }}
                </div>
            </template>
     </el-table-column>
</el-table>
<el-button @click="exportExcel(123)">导出</el-button>

 

    import FileSaver from 'file-saver'
    import * as XLSX from 'xlsx'

    exportExcel(excelName) {
      try {
        const $e = this.$refs['selfTable'].$el
        let $table = $e.querySelector('.el-table__fixed')
        if (!$table) {
          $table = $e
        }
        const wb = XLSX.utils.table_to_book($table, { raw: true })
        const wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
        FileSaver.saveAs(
          new Blob([wbout], { type: 'application/octet-stream' }),
          `${excelName}.xlsx`,
        )
      } catch (e) {
        if (typeof console !== 'undefined') console.error(e)
      }
    }

3.后端写好的导出excel接口,前端如何发送请求

方法一: 

const downloadAll = () => {
  window.open(
  //接口url
  `http://111.11.11.11:1111/export-data?${qs.stringify(queryData)}`,'_blank'
  );
};

方法二

 首先需要下载 js-file-download 包

npm install js-file-download

在需要使用的页面引入

import fileDownload from 'js-file-download';

封装导出请求方法,必须配置blob流文件, responseType: "blob",否则可能出现文件损坏问题

export function export(data) {
  return request({
    responseType: "blob",
    url: "export/data",
    method: "post",
    data: JSON.stringify(data),
    headers: {
      "Content-Type": "application/json",
    },
  });
}

调用导出接口

const res = await export(queryData);
fileDownload(res, 'xxxx.xlsx')
//如果后台格式是 .xls的,下载的文件可能会损坏,需要把文件名改成对应的格式 xxx.xls

方法三:使用原生js下载或导出

封装导出方法,必须配置 responseType: 'arraybuffer',

export const fileDownload = (id) => (
  service({
    url: `/template?id=${id}`,
    method: 'get',
    responseType: 'arraybuffer',
    showLoading: true,
    developer: 'local_url',
  })
)

fileDownload(row.id).then(res => {
        let {data, headers} = res
        let type = headers['content-type']
        let name = headers['content-disposition'] || ''
        let nameArr = name.split('=')
        let fileName = decodeURI(nameArr[nameArr.length - 1])
        let blob = new Blob([data], {type})
        if (typeof window.navigator.msSaveBlob !== 'undefined') {
          /*
           * IE workaround for "HTML7007: One or more blob URLs were revoked by closing
           * the blob for which they were created. These URLs will no longer resolve as
           * the data backing the URL has been freed."
           */
          window.navigator.msSaveBlob(blob, fileName)
        } else {
          let URL = window.URL || window.webkitURL
          let objectUrl = URL.createObjectURL(blob)
          if (fileName) {
            var a = document.createElement('a')
            // safari doesn't support this yet
            if (typeof a.download === 'undefined') {
              window.location = objectUrl
            } else {
              a.href = objectUrl
              a.download = fileName
              document.body.appendChild(a)
              a.click()
              a.remove()
            }
          } else {
            window.location = objectUrl
          }
        }
      })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值