此問題沒有修復前的效果,直接通過 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
