├── .gitignore ├── .DS_Store ├── files └── users.xlsx ├── routes ├── .DS_Store └── index.js ├── views ├── error.ejs └── index.ejs ├── README.md ├── public └── stylesheets │ └── style.css ├── package.json ├── Models └── User.js ├── app.js ├── Controller └── User.js └── bin └── www /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmirMustafa/export-to-excel/HEAD/.DS_Store -------------------------------------------------------------------------------- /files/users.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmirMustafa/export-to-excel/HEAD/files/users.xlsx -------------------------------------------------------------------------------- /routes/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmirMustafa/export-to-excel/HEAD/routes/.DS_Store -------------------------------------------------------------------------------- /views/error.ejs: -------------------------------------------------------------------------------- 1 |

<%= message %>

2 |

<%= error.status %>

3 |
<%= error.stack %>
4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # export-to-excel 2 | An Express.js / Node.js application that exports data in an Excel file 3 | 4 | ## Review 5 | Please leave a ⭐ if you like it 6 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= title %> 5 | 6 | 7 | 8 |

<%= title %>

9 |

Welcome to <%= title %>

10 | 11 | 12 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require("express"); 2 | const exportUser = require("../Controller/User"); 3 | 4 | var router = express.Router(); 5 | 6 | /* GET home page. */ 7 | router.get("/", function (req, res, next) { 8 | res.render("index", { title: "Express" }); 9 | }); 10 | 11 | router.get("/downloadExcel", exportUser); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "export-to-excel", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www", 7 | "dev": "nodemon ./bin/www" 8 | }, 9 | "dependencies": { 10 | "cookie-parser": "~1.4.4", 11 | "debug": "~2.6.9", 12 | "ejs": "~2.6.1", 13 | "exceljs": "^4.3.0", 14 | "express": "~4.16.1", 15 | "http-errors": "~1.6.3", 16 | "morgan": "~1.9.1" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Models/User.js: -------------------------------------------------------------------------------- 1 | // Get data from database 2 | 3 | // Sample data 4 | 5 | const User = [ 6 | { fname: "Amir", lname: "Mustafa", email: "amir@gmail.com", gender: "Male" }, 7 | { 8 | fname: "Ashwani", 9 | lname: "Kumar", 10 | email: "ashwani@gmail.com", 11 | gender: "Male", 12 | }, 13 | { fname: "Nupur", lname: "Shah", email: "nupur@gmail.com", gender: "Female" }, 14 | { 15 | fname: "Himanshu", 16 | lname: "Mewari", 17 | email: "amir@gmail.com", 18 | gender: "Male", 19 | }, 20 | { 21 | fname: "Vankayala", 22 | lname: "Sirisha", 23 | email: "sirisha@gmail.com", 24 | gender: "Female", 25 | }, 26 | ]; 27 | 28 | module.exports = User; 29 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var createError = require("http-errors"); 2 | var express = require("express"); 3 | var path = require("path"); 4 | var cookieParser = require("cookie-parser"); 5 | var logger = require("morgan"); 6 | 7 | var indexRouter = require("./routes/index"); 8 | // var usersRouter = require('./routes/users'); 9 | 10 | var app = express(); 11 | 12 | // view engine setup 13 | app.set("views", path.join(__dirname, "views")); 14 | app.set("view engine", "ejs"); 15 | 16 | app.use(logger("dev")); 17 | app.use(express.json()); 18 | app.use(express.urlencoded({ extended: false })); 19 | app.use(cookieParser()); 20 | app.use(express.static(path.join(__dirname, "public"))); 21 | 22 | app.use("/", indexRouter); 23 | 24 | // catch 404 and forward to error handler 25 | app.use(function (req, res, next) { 26 | next(createError(404)); 27 | }); 28 | 29 | // error handler 30 | app.use(function (err, req, res, next) { 31 | // set locals, only providing error in development 32 | res.locals.message = err.message; 33 | res.locals.error = req.app.get("env") === "development" ? err : {}; 34 | 35 | // render the error page 36 | res.status(err.status || 500); 37 | res.render("error"); 38 | }); 39 | 40 | module.exports = app; 41 | -------------------------------------------------------------------------------- /Controller/User.js: -------------------------------------------------------------------------------- 1 | const User = require("../Models/User"); 2 | const excelJS = require("exceljs"); 3 | 4 | const exportUser = async (req, res) => { 5 | const workbook = new excelJS.Workbook(); 6 | const worksheet = workbook.addWorksheet("My Users"); 7 | const path = "./files"; 8 | 9 | worksheet.columns = [ 10 | { header: "S no.", key: "s_no", width: 10 }, 11 | { header: "First Name", key: "fname", width: 10 }, 12 | { header: "Last Name", key: "lname", width: 10 }, 13 | { header: "Email Id", key: "email", width: 10 }, 14 | { header: "Gender", key: "gender", width: 10 }, 15 | ]; 16 | 17 | let counter = 1; 18 | 19 | User.forEach((user) => { 20 | user.s_no = counter; 21 | worksheet.addRow(user); 22 | counter++; 23 | }); 24 | 25 | worksheet.getRow(1).eachCell((cell) => { 26 | cell.font = { bold: true }; 27 | }); 28 | 29 | try { 30 | res.setHeader( 31 | "Content-Type", 32 | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 33 | ); 34 | res.setHeader("Content-Disposition", `attachment; filename=users.xlsx`); 35 | 36 | return workbook.xlsx.write(res).then(() => { 37 | res.status(200); 38 | }); 39 | 40 | // await workbook.xlsx.writeFile(`${path}/users.xlsx`).then(() => { 41 | // res.send({ 42 | // status: "success", 43 | // message: "file successfully downloaded", 44 | // path: `${path}/users.xlsx`, 45 | // }); 46 | // }); 47 | } catch (err) { 48 | res.send({ 49 | status: "error", 50 | message: "Something went wrong", 51 | }); 52 | } 53 | }; 54 | 55 | module.exports = exportUser; 56 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('export-to-excel:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | --------------------------------------------------------------------------------