DEV Community

Gaurang Parante
Gaurang Parante

Posted on • Edited on

2

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!

Billboard image

Imagine monitoring that's actually built for developers

Join Vercel, CrowdStrike, and thousands of other teams that trust Checkly to streamline monitor creation and configuration with Monitoring as Code.

Start Monitoring

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay