Search code examples
javascriptexcelbufferxlsxfs

Excel file from server to client | Javascript


What I want to do: I have on the server side a file 'test_download.xlsx', and want to send it to the client side so that I can apply XLSX.read() on the retrieved object.

So I tried it this way

Server :

let filename = 'test_download.xlsx';
const buffer = fs.readFileSync(filename)
res.json(buffer);

Client :

file = await axios.get('/dataexplorer/test');
console.log(file);
console.log(XLSX.read(file.data, {type: "buffer"}));

First log :

enter image description here

Second log :

The problem is that it doesn't match my excel file at all just in terms of sheets (my file has 3 different sheet names) Do you have any idea what the problem is?

Thanks


Solution

  • On the server-side just use:

    const filename = 'test_download.xlsx';
    // make sure to include the name and the extension of the file in the path
    const filepath = 'your/path/to/the/file/test_download.xlsx';
    /** filename is optional: 
     * if you don't pass it, the name of the file in the filepath will be used
     * if you pass it the file at hte filepath will be downloaded with the name of `filename`
     */
    res.download(filepath, filename);
    

    This will return a blob to the client(make sure to include the correct headers for the response type) and then you can just save it or work with it with :

    file = await axios.get('/dataexplorer/test',{ responseType: "blob"});
    const ab = await file.data.arrayBuffer();
    XLSX.read(Buffer.from(ab),{type:"buffer"})