如何使用exceljs在node.js中下载创建的excel文件

cod*_*ess 8 node.js express exceljs

我正在使用exceljs模块来创建excel文件.问题是它既没有被创建也没有被保存在路径中.

var excel = require('exceljs');
var options = {
    filename: './streamed-workbook.xlsx',
    useStyles: true,
    useSharedStrings: true
};

var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
var sheet = workbook.addWorksheet('My Sheet');
worksheet.columns = [
    { header: 'Id', key: 'id', width: 10 },
    { header: 'Name', key: 'name', width: 32 },
    { header: 'D.O.B.', key: 'DOB', width: 10 }
];

worksheet.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)});
worksheet.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});
worksheet.commit();

workbook.commit().then(function(){
    console.log('xls file is written.');
});
Run Code Online (Sandbox Code Playgroud)

但是当我运行代码时没有任何反应.没有创建excel.我在这里错过了什么?

***********************编辑**************************对我的代码进行了以下更改,但仍然无法正常工作.

        var Excel = require('exceljs');
        var workbook = new Excel.Workbook();
        var worksheet = workbook.addWorksheet('My Sheet');
        worksheet.columns = [
            { header: 'Id', key: 'id', width: 10 },
            { header: 'Name', key: 'name', width: 32 },
            { header: 'D.O.B.', key: 'DOB', width: 10 }
        ];
        worksheet.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)});
        worksheet.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});
        workbook.commit();
        workbook.xlsx.writeFile('./temp.xlsx').then(function() {
            // done
            console.log('file is written');
        });
Run Code Online (Sandbox Code Playgroud)

Dan*_*lle 9

为了将excel工作簿发送给客户端,您可以:

使用异步等待:

async function sendWorkbook(workbook, response) { 
    var fileName = 'FileName.xlsx';

    response.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

     await workbook.xlsx.write(response);

    response.end();
}
Run Code Online (Sandbox Code Playgroud)

使用诺言:

function sendWorkbook(workbook, response) { 
    var fileName = 'FileName.xlsx';

    response.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

    workbook.xlsx.write(response).then(function(){
        response.end();
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 我收到损坏的 Excel 文件。 (2认同)

cod*_*ess 6

所以我发现我因为 workbook.commit() 而出错。我删除了提交,一切都开始像魅力一样工作。以下是创建和下载 excel 文件的完整工作代码:

注意:我正在使用一个名为tempfile的 npm 模块为创建的 excel 文件创建一个临时文件路径。然后会自动删除此文件路径。希望这可以帮助。

try {
        var workbook = new Excel.Workbook();
        var worksheet = workbook.addWorksheet('My Sheet');

        worksheet.columns = [
            { header: 'Id', key: 'id', width: 10 },
            { header: 'Name', key: 'name', width: 32 },
            { header: 'D.O.B.', key: 'DOB', width: 10 }
        ];
        worksheet.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)});
        worksheet.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});

        var tempFilePath = tempfile('.xlsx');
        workbook.xlsx.writeFile(tempFilePath).then(function() {
            console.log('file is written');
            res.sendFile(tempFilePath, function(err){
                console.log('---------- error downloading file: ' + err);
            });
        });
    } catch(err) {
        console.log('OOOOOOO this is the error: ' + err);
    }
Run Code Online (Sandbox Code Playgroud)


gan*_*ivs 5

从这个链接https://github.com/exceljs/exceljs/issues/37得到答案

    router.get('/createExcel', function (req, res, next) {
    var workbook = new Excel.Workbook();

    workbook.creator = 'Me';
    workbook.lastModifiedBy = 'Her';
    workbook.created = new Date(1985, 8, 30);
    workbook.modified = new Date();
    workbook.lastPrinted = new Date(2016, 9, 27);
    workbook.properties.date1904 = true;

    workbook.views = [
        {
            x: 0, y: 0, width: 10000, height: 20000,
            firstSheet: 0, activeTab: 1, visibility: 'visible'
        }
    ];
    var worksheet = workbook.addWorksheet('My Sheet');
    worksheet.columns = [
        { header: 'Id', key: 'id', width: 10 },
        { header: 'Name', key: 'name', width: 32 },
        { header: 'D.O.B.', key: 'dob', width: 10, outlineLevel: 1, type: 'date', formulae: [new Date(2016, 0, 1)] }
    ];

    worksheet.addRow({ id: 1, name: 'John Doe', dob: new Date(1970, 1, 1) });
    worksheet.addRow({ id: 2, name: 'Jane Doe', dob: new Date(1965, 1, 7) });

    res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    res.setHeader("Content-Disposition", "attachment; filename=" + "Report.xlsx");
    workbook.xlsx.write(res)
        .then(function (data) {
            res.end();
            console.log('File write done........');
        });
 }
Run Code Online (Sandbox Code Playgroud)


Pri*_*ess 0

您的代码中有错误。

您已使用一个变量声明了“我的工作表”,并在整个代码中使用了不同的变量。

var Sheet = workbook.addWorksheet('我的工作表');

工作表.columns = [ { header: 'Id', key: 'id', width: 10 }, { header: 'Name', key: 'name', width: 32 }, { header: 'DOB', key: 'DOB',宽度:10 } ];

工作表.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)});

工作表.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});

工作表.commit();

将变量Sheet更改为Worksheet。就像下面的代码一样

var worksheet = workbook.addWorksheet('我的工作表');

工作表.columns = [ { header: 'Id', key: 'id', width: 10 }, { header: 'Name', key: 'name', width: 32 }, { header: 'DOB', key: 'DOB',宽度:10 } ];

工作表.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)});

工作表.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});

工作表.commit();

这应该可以解决你的问题。谢谢