簡體   English   中英

使用nodejs將excel文件寫入文件stream並在瀏覽器中使用api調用下載它

[英]Write excel file to file stream with nodejs and download it with api call in browser

我遇到了如何將 excel 文件寫入文件流並在瀏覽器中下載的問題。我只能在服務器中創建新文件,但這不是我想要的。我不想在服務器上創建(如果它必須創建,然后我也想在用戶在瀏覽器中下載它時刪除它)。

但我無法實現下載..

所以一般的想法是我閱讀 csv 文件,而不是解析數據。

我還閱讀了一個模板 Excele 文件,我將其覆蓋並將其寫入文件 stream。 當我調用 get API 時,我就可以開始下載了(我稍后會將它集成到 Angular 應用程序中)..

我正在使用 Exceljs npm package。

我沒有任何錯誤,但代碼沒有按我的意願工作

我在 github 中上傳了整個代碼,因此您可以輕松查看代碼並復制我的代碼。

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

我的 excel-builder 腳本:

export const generateExcel = async (req: Request, res: Response) => {
  try {
    await csvParse();
    res.setHeader("Content-disposition", `attachment;`);
    res.contentType(
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    );

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

謝謝大家!

const csv = require('fast-csv');
const fs = require('fs');

function exportCSVFile(res, path, data) {
    const ws = fs.createWriteStream(path + ".csv");
    ws.on("finish", function () {
        res.download(path + ".csv", () => {
            fs.unlinkSync(path + ".csv");
        });
    });
    csv.write(data, {headers: true}).pipe(ws);
}

您使用此導出 csv function 進行回復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM