后端用node-xlsx生成excel表格,通過Buffer返回給前端,文件無效或文件損壞問題


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM