此問題沒有修復前的效果,直接通過 res.end(xlsxBuffer),返回前端
具體完整解決方案:見下
服務端:
1.node-xlsx的安裝
npm install node-xlsx --save
2.單獨抽出一個文件 寫導表的邏輯
附:https://www.npmjs.com/package/node-xlsx npm文檔
const xlsx = require('node-xlsx'); // const fs = require('fs'); /** * 創建表格 * @param excelData * @param config */ function createExcel(excelData, config = {}){ let xlsxBuildArr = [ { name:'一班', data:[ ['姓名', '年齡'], ['張三', 18], ['李四', 19] ] }, { name:'二班', data:[ ['姓名', '年齡'], ['王五', 18], ['劉六', 18] ] } ]; let buffer = xlsx.build( xlsxBuildArr ); // const filename = config.filename || 'fileName.xlsx'; // //write default utf-8 // fs.writeFileSync( // filename, // buffer // ); // console.log( filename + ' 文件已生成 √√√'); return buffer; } module.exports = { createExcel }
問題 解決方向:
正如Luke在注釋中提到的,您必須在發送緩沖區之前進行base64編碼。下面是一個使用NPM模塊node-xlsx的代碼片段。
后端路由 部分(我這里用的 express )
const {createExcel} = require('../data-create/excel.js'); // 導出 excel router.get('/downloadXlsx', function (req, res){ // 這里根據 你的情況 來寫 createExcel const xlsxBuffer = createExcel(jimiJson, {}); // res.setHeader('Content-Type', 'application/vnd.openxmlformats;charset=utf-8'); res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'); // res.setHeader("Content-Disposition", "attachment; filename=aaa.xlsx"); // res.send( xlsxBuffer ); // res.end( xlsxBuffer, 'binary' ); res.end( xlsxBuffer.toString('base64') ); });
前端頁面 (以jquery 為例):
$.ajax({ url: UTILS.serverUrl + '/hash/downloadJimiXlsx', method: 'GET', data: { shopName: "xxxx" }, success: (res)=>{ function base64ToArrayBuffer(base64) { var binary_string = window.atob(base64); var len = binary_string.length; var bytes = new Uint8Array(len); for (var i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); } return bytes.buffer; } const blob = new Blob([base64ToArrayBuffer(res)], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' }); let downloadElement = document.createElement('a'); let href = window.URL.createObjectURL(blob); downloadElement.href = href; downloadElement.download = `測試表格.xlsx`; document.body.appendChild(downloadElement); downloadElement.click(); document.body.removeChild(downloadElement); window.URL.revokeObjectURL(href); } })
參考:
https://blog.csdn.net/qq_33890442/article/details/107090818
https://www.it1352.com/1799083.html