【问题标题】:How to download created excel file in node.js using exceljs如何使用 exceljs 在 node.js 中下载创建的 excel 文件
【发布时间】:2016-11-06 10:39:22
【问题描述】:

我正在使用 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.');
});

但是当我运行代码时,什么也没有发生。未创建 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');
        });

【问题讨论】:

  • 你在哪里使用这个代码控制器或架构页面@codeinprogess
  • 不知道你说的“schema page”是什么意思,这段代码在我路由器的js文件里
  • 你有没有excel下载的示例@codeinprogress
  • 在下面查看我的解决方案。
  • 我必须在我的控制器代码中使用您的代码还是如何在服务器页面@code in progress 中调用您的代码

标签: node.js express exceljs


【解决方案1】:

为了将 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();
}

使用承诺:

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();
    });
}

【讨论】:

  • 该文件没有被下载,但在响应中有这个带有随机字符的不可读内容。你知道为什么这种方法对我不起作用吗?
  • @Kirubel 如果您使用邮递员,您可以单击保存响应下拉菜单并选择保存到文件。根据设置为标题的内容类型,比如说excel格式,它将保存为excel文件。
  • 我的 Excel 文件已损坏。
【解决方案2】:

所以我发现由于 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);
    }

【讨论】:

  • 如何从 controller.js 端调用此代码。你能告诉@codein 进度吗
  • 在我的例子中它是一个 router.get() 请求。所以 router.get('/download', function(req, res){...上面的代码});
  • 你能检查我的代码吗? @Codeinprogress stackoverflow.com/questions/44369082/…我已经这样做了
  • 看起来您正在为 node.js 使用不同的 excel 模块。这是我正在使用的:npmjs.com/package/exceljs
  • 嗨,我是 AngularJS 的新手。我收到路由器未定义错误,我应该在哪里使用此代码。 var excel = require('exceljs'); var options = { filename: './streamed-workbook.xlsx', useStyles: true, useSharedStrings: true };
【解决方案3】:

从此链接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........');
        });
 }

【讨论】:

  • 其实你的答案是最好的
  • 生成的文件已损坏,知道为什么吗?
【解决方案4】:

此代码 sn-p 将 node.js 与 excel4node 和 express 模块一起使用,以便使用 Javascript 将 JSON 数据转换为 Excel 文件并将其发送到客户端。

const xl = require('excel4node');
const express = require('express');
const app = express();

var json = [{"Vehicle":"BMW","Date":"30, Jul 2013 09:24 AM","Location":"Hauz Khas, Enclave, New Delhi, Delhi, India","Speed":42},{"Vehicle":"Honda CBR","Date":"30, Jul 2013 12:00 AM","Location":"Military Road,  West Bengal 734013,  India","Speed":0},{"Vehicle":"Supra","Date":"30, Jul 2013 07:53 AM","Location":"Sec-45, St. Angel's School, Gurgaon, Haryana, India","Speed":58},{"Vehicle":"Land Cruiser","Date":"30, Jul 2013 09:35 AM","Location":"DLF Phase I, Marble Market, Gurgaon, Haryana, India","Speed":83},{"Vehicle":"Suzuki Swift","Date":"30, Jul 2013 12:02 AM","Location":"Behind Central Bank RO, Ram Krishna Rd by-lane, Siliguri, West Bengal, India","Speed":0},{"Vehicle":"Honda Civic","Date":"30, Jul 2013 12:00 AM","Location":"Behind Central Bank RO, Ram Krishna Rd by-lane, Siliguri, West Bengal, India","Speed":0},{"Vehicle":"Honda Accord","Date":"30, Jul 2013 11:05 AM","Location":"DLF Phase IV, Super Mart 1, Gurgaon, Haryana, India","Speed":71}]

const createSheet = () => {

  return new Promise(resolve => {

// setup workbook and sheet
var wb = new xl.Workbook();

var ws = wb.addWorksheet('Sheet');

// Add a title row

ws.cell(1, 1)
  .string('Vehicle')

ws.cell(1, 2)
  .string('Date')

ws.cell(1, 3)
  .string('Location')

ws.cell(1, 4)
  .string('Speed')

// add data from json

for (let i = 0; i < json.length; i++) {

  let row = i + 2

  ws.cell(row, 1)
    .string(json[i].Vehicle)

  ws.cell(row, 2)
    .date(json[i].Date)

  ws.cell(row, 3)
    .string(json[i].Location)

  ws.cell(row, 4)
    .number(json[i].Speed)
}

resolve( wb )

  })
}

app.get('/excel', function (req, res) {

  createSheet().then( file => {
    file.write('ExcelFile.xlsx', res);
  })

});

app.listen(3040, function () {
  console.log('Excel app listening on port 3040');
});

【讨论】:

    【解决方案5】:

    您的代码中有错误。

    您已经用一个变量声明了 My Sheet,并在整个代码中使用了不同的变量。

    var sheet = workbook.addWorksheet('My Sheet');

    工作表.columns = [ { 标题:'Id',键:'id',宽度:10 }, { 标题:'名称',键:'名称',宽度:32 }, { header: 'DOB.', key: 'DOB', width: 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 = [ { 标题:'Id',键:'id',宽度:10 }, { 标题:'名称',键:'名称',宽度:32 }, { header: 'DOB.', key: 'DOB', width: 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();

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

    【讨论】:

    • 进行了上述修改,但仍然无法正常工作。
    • 我在编辑下的代码是我正在使用的代码。我根据他们的文档编写了一个示例,但没有成功。
    【解决方案6】:
    var excel = require("exceljs");
    var workbook1 = new excel.Workbook();
    workbook1.creator = 'Me';
    workbook1.lastModifiedBy = 'Me';
    workbook1.created = new Date();
    workbook1.modified = new Date();
    var sheet1 = workbook1.addWorksheet('Sheet1');
    var reHeader=['FirstName','LastName','Other Name'];
    var reColumns=[
        {header:'FirstName',key:'firstname'},
        {header:'LastName',key:'lastname'},
        {header:'Other Name',key:'othername'}
    ];
    sheet1.columns = reColumns;
    workbook1.xlsx.writeFile("./uploads/error.xlsx").then(function() {
        console.log("xlsx file is written.");
    });
    

    这会在上传文件夹中创建 xlsx 文件。

    【讨论】:

    • 好的,但是有没有办法在它创建后立即下载它?我希望用户单击一个按钮 > 生成 excel 文件 > 为他们提供下载/保存选项。
    • 我找到了下载创建文件的解决方案。请看:stackoverflow.com/questions/39667773/…
    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多