首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js,exceljs下载的excel文件已损坏,并且内容错误。

问Node.js,exceljs下载的excel文件已损坏,并且内容错误。
EN

Stack Overflow用户
提问于 2022-08-16 07:47:25
回答 1查看 23关注 0票数 0

使用我的NodeJS API,我想要下载一个excel文件。我使用的是卓越的npm软件包。

所以我的想法是:我想读取csv文件并解析数据,之后我还想读取一个excel模板文件,然后用csv的数据填充这个excel文件。最后,我还想下载这个新的excel文件。

在第一个函数中,我设置标头并调用函数csvParse();在csvParse()函数中,我读取csv文件并解析它,在解析数据时,我调用函数generateFile();在generateFile()函数中,我读取模板文件,然后将其写回有更改内容的流(我还没有更改内容,但在实际下载正确的文件时会这样做)。

我不知道我做错了什么。

代码语言:javascript
复制
export const generateExcel = async (req: Request, res: Response) => {
  try {
    res.setHeader("Content-disposition", "attachment; filename=" + "Report.xlsx");
    res.contentType(
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    );

    await csvParse();       

    return res.status(200).json("Success");
  } catch (err) {
    return res.status(500).json("False");
  }
};

const csvParse = async () => {
  fs.createReadStream("./content/TestCsv.csv")
    .pipe(csv.parse())
    .on("error", (error: any) => console.log("Error"))
    .on("data", (row: any) => {
      let line: any = String(row);
      line = line.split(";");
      //let parsedData = line[0];
      let parsedData = line;
      allParsedData.push(parsedData);
    })
    .on("end", (rowCount: any) => {
      let test = allParsedData.toString();
      generateFile(test);
    });
};

const generateFile = (data: any) => {
  return new Promise<fs.ReadStream>((resolve, reject) => {
    const workbook = new Excel.Workbook();

    workbook.xlsx.readFile("./utilities/template.xlsx").then(() => {
      workbook.xlsx.writeFile("./content/Test.xlsx").then(
        () => {
          let stream = fs.createReadStream("./content/Test.xlsx");
          stream.on("close", () => {
            fs.unlink("./content/Test.xlsx", (error) => {
              if (error) {
                throw error;
              }
            });
          });

          resolve(stream);
        },
        (err) => {
          throw err;
        }
      );
    });
  });
};

所以用我的代码我可以下载一个文件,但是它已经损坏了。如果我将下载的文件更改为csv,则该文件的内容仅为字符串"Success“。

源代码: https://github.com/zigax1/mean-generate-download-excel/tree/master

EN

Stack Overflow用户

发布于 2022-08-16 09:14:46

在发送文件时,需要设置响应类型。

代码语言:javascript
复制
  return res.type("application/octet-stream").status(200).send(data);

数据为const file = await book.xlsx.writeBuffer();缓冲区类型。

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

https://stackoverflow.com/questions/73370467

复制
相关文章

相似问题

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