DEV Community

Gaurang Parante
Gaurang Parante

Posted on • Edited on

How to Upload an Excel File in Node.js Using Express and Multer

I'm trying to upload an Excel file in my Node.js application using Express, Multer, and the XLSX library. I've put together the following setup, but I want to ensure I'm doing it correctly and efficiently. Here is my code:

server.js

const express = require('express');
const multer = require('multer');
const xlsx = require('xlsx');
const path = require('path');
const fs = require('fs');

const app = express();

// Serve the HTML file for the upload form
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'index.html'));
});

// Multer configuration
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './uploads'); // Uploads directory
    },
    filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

const upload = multer({
    storage: storage,
    fileFilter: function (req, file, cb) {
        const ext = path.extname(file.originalname);
        if (ext !== '.xlsx' && ext !== '.xls') {
            return cb(new Error('Only Excel files are allowed'));
        }
        cb(null, true);
    }
});

// Route to handle file upload
app.post('/upload', upload.single('excel'), (req, res) => {
    try {
        if (!req.file) {
            return res.status(400).send('Please upload an Excel file');
        }

        // Process uploaded file
        const filePath = req.file.path;
        const workbook = xlsx.readFile(filePath);
        const sheetName = workbook.SheetNames[0]; // Assuming it's the first sheet

        // Reading the first sheet
        const worksheet = workbook.Sheets[sheetName];
        const data = xlsx.utils.sheet_to_json(worksheet);
        console.log(data);

        // Redirect to the main page
        res.redirect('/');
    } catch (error) {
        console.error(error);
        res.status(500).send('Error processing file');
    }
});
Enter fullscreen mode Exit fullscreen mode

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Upload Excel</title>
</head>

<body>
    <h1>Upload Excel File</h1>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="excel" accept=".xls, .xlsx" required>
        <button type="submit">Upload</button>
    </form>
</body>

</html>
Enter fullscreen mode Exit fullscreen mode

Explanation
Express: Handles HTTP requests and serves static files (index.html).
Multer: Middleware for handling multipart/form-data, used here for file uploads.
XLSX: Library for parsing Excel files.
Path and FS: Node.js modules for handling file paths and system operations.

How It Works:
HTML Form: Provides a form for users to upload Excel files.
Multer Configuration: Sets up Multer to save uploaded files in the ./uploads directory and filter for .xlsx and .xls file types.
File Upload Route: Handles the file upload, reads the Excel file using xlsx.readFile, extracts data from the first sheet, and logs the data to the console.

Questions:
Is this the best way to handle Excel file uploads and processing in Node.js?
Are there any improvements or best practices I should consider for error handling and security?
Any advice or suggestions would be greatly appreciated!

Top comments (0)