首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExcelJS无法写入工作簿

ExcelJS无法写入工作簿
EN

Stack Overflow用户
提问于 2022-02-10 20:41:41
回答 1查看 508关注 0票数 1

我试图从数据库中获取数据,并为每个用户的数据创建一个excel表。表会被创建,但是由于某种原因,数据不会被写入。

我知道NodeJS是异步的,有时您会在完成数据写入之前发送文件。然而,我console.log每个动作,他们似乎执行正确的顺序。

这是我的代码及其输出。结果Excel工作簿为什么有空工作表?

代码语言:javascript
复制
const createWorkbook = () => {
  return new Promise(resolve => {
    resolve(new excel.Workbook());
  });
}

const getAssemblers = () => {
  return new Promise(async resolve => {
    resolve(await db.models.assembler.findAll())
  });
}

const createWorksheet = (workbook, name) => {
  return new Promise(resolve => {
    resolve(workbook.addWorksheet(name));
  });
};

const getAssemblerData = (id) => {
  return new Promise(async resolve => {
    const assemblyTimes = await db.models.assemblyTime.findAll({
      where: {
        assemblerID: id,
      },
      include: [
        db.models.assembler,
        db.models.item,
      ],
    });

    let assemblyData = [];

    assemblyTimes.forEach((assembly) => {
      assemblyData.push({
        assembler: assembly.assembler.name,
        item: assembly.item.name,
        start: assembly.start,
        end: assembly.end,
        duration: assembly.duration
      });
    });

    resolve(assemblyData);
  })
}

const writeDataToSheet = (worksheet, data) => {
  return new Promise(async resolve => {
    worksheet.columns = [
      { header: 'Assembler', key: 'assembler', width: 30 },
      { header: 'Item', key: 'item', width: 30 },
      { header: 'Start', key: 'start', width: 10 },
      { header: 'End', key: 'end', width: 20 },
      { header: 'Duration', key: 'duration', width: 20 },
    ];
    worksheet.addRows(data)
    resolve();
  });
};

app.get('/download', async (req, res) => {
  try {
    const workbook = await createWorkbook();
    console.log('Created workbook');
    const assemblers = await getAssemblers();
    console.log('Fetched Assemblers');
    console.log(assemblers);

    assemblers.forEach(async (assembler) => {
      const worksheet = await createWorksheet(workbook, assembler.name);
      console.log("Created assembler's worksheet");
      const assemblyData = await getAssemblerData(assembler.id);
      console.log("Fetched assembler's data");
      console.log(assemblyData)
      await writeDataToSheet(worksheet, assemblyData);
      console.log('Written!')
    });

    res.setHeader(
      'Content-Type',
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    );
    res.setHeader(
      'Content-Disposition',
      'attachment; filename=assemblyData.xlsx',
    );

    return workbook.xlsx.write(res).then(() => {
      res.status(200).end();
      console.log('Sent!')
    });


  } catch (err) {
    console.error(err);
    res.sendStatus(500);
  }
});

控制台输出:

代码语言:javascript
复制
Created workbook
Fetched Assemblers
[
  assembler {
    dataValues: { id: 2, name: 'User 1' },
    _previousDataValues: { id: 2, name: 'User 1' },
    uniqno: 1,
    _changed: Set(0) {},
    _options: {
      isNewRecord: false,
      _schema: null,
      _schemaDelimiter: '',
      raw: true,
      attributes: [Array]
    },
    isNewRecord: false
  },
  assembler {
    dataValues: { id: 3, name: 'User 2' },
    _previousDataValues: { id: 3, name: 'User 2' },
    uniqno: 1,
    _changed: Set(0) {},
    _options: {
      isNewRecord: false,
      _schema: null,
      _schemaDelimiter: '',
      raw: true,
      attributes: [Array]
    },
    isNewRecord: false
  }
]
Created assembler's worksheet
Created assembler's worksheet
Fetched assembler's data
[
  {
    assembler: 'User 1',
    item: 'Chair',
    start: 2022-02-10T19:18:12.000Z,
    end: 2022-02-10T19:18:14.000Z,
    duration: 2
  },
  {
    assembler: 'User 1',
    item: 'Down Time',
    start: 2022-02-10T19:18:14.000Z,
    end: 2022-02-10T19:18:16.000Z,
    duration: 2
  },
  {
    assembler: 'User 1',
    item: 'Chair',
    start: 2022-02-10T19:18:16.000Z,
    end: 2022-02-10T19:18:20.000Z,
    duration: 4
  },
  {
    assembler: 'User 1',
    item: 'Down Time',
    start: 2022-02-10T19:18:20.000Z,
    end: 2022-02-10T19:18:24.000Z,
    duration: 4
  },
  {
    assembler: 'User 1',
    item: 'Chair',
    start: 2022-02-10T19:18:24.000Z,
    end: 2022-02-10T19:18:29.000Z,
    duration: 5
  }
]
Written!
Fetched assembler's data
[
  {
    assembler: 'User 2',
    item: 'Down Time',
    start: 2022-02-10T19:18:29.000Z,
    end: 2022-02-10T19:18:31.000Z,
    duration: 2
  },
  {
    assembler: 'User 2',
    item: 'Chair',
    start: 2022-02-10T19:18:31.000Z,
    end: 2022-02-10T19:18:35.000Z,
    duration: 4
  },
  {
    assembler: 'User 2',
    item: 'Down Time',
    start: 2022-02-10T19:18:36.000Z,
    end: 2022-02-10T19:18:39.000Z,
    duration: 3
  },
  {
    assembler: 'User 2',
    item: 'Chair',
    start: 2022-02-10T19:18:39.000Z,
    end: 2022-02-10T19:18:46.000Z,
    duration: 7
  },
  {
    assembler: 'User 2',
    item: 'Down Time',
    start: 2022-02-10T19:18:46.000Z,
    end: 2022-02-10T19:18:53.000Z,
    duration: 7
  },
  {
    assembler: 'User 2',
    item: 'Chair',
    start: 2022-02-10T19:18:53.000Z,
    end: 2022-02-10T19:18:58.000Z,
    duration: 5
  }
]
Written!
Sent!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 21:42:39

尝试使用for..of而不是.forEach

代码语言:javascript
复制
for (const assembler of assemblers) {
    const worksheet = await createWorksheet(workbook, assembler.name);
    console.log("Created assembler's worksheet");
    const assemblyData = await getAssemblerData(assembler.id);
    console.log("Fetched assembler's data");
    console.log(assemblyData)
    await writeDataToSheet(worksheet, assemblyData);
    console.log('Written!')
}

请参阅这里的更多内容:Using async/await with a forEach loop

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71071998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档