UNPKG

@tasolutions/express-core

Version:
76 lines (65 loc) 2.96 kB
const Response = require('../../utils/v1Response'); const queryUtil = require('../../utils/query.util'); const { mapHeadersToQuery, headersToInclude } = require('../../utils/requestHeader'); const excel = require('exceljs'); module.exports = { /** * This crud exportToExcel */ exportToExcel: async (req, res, Collection, configs) => { try { await mapHeadersToQuery(req, Collection); const sort = queryUtil.getSort(req); const query = await queryUtil.getQuery(Collection, req); if (req.query.search) { query = queryUtil.search(Collection, req.query.search); } const populate = req.headers['x-populate'] ? req.headers['x-populate'].split(',') : queryUtil.populateField(Collection); const results = await Collection.find(query).populate(populate).sort(sort); const workbook = new excel.Workbook(); const worksheet = workbook.addWorksheet('Data'); const generateHeaders = (schema, prefix = '') => { const headers = []; for (const path in schema.paths) { const fieldSchema = schema.paths[path]; if (fieldSchema.instance === 'ObjectID' && fieldSchema.options.ref) { const refSchema = mongoose.model(fieldSchema.options.ref).schema; const refHeaders = generateHeaders(refSchema, `${prefix}${path}.`); headers.push(...refHeaders); } else { headers.push(`${prefix}${path}`); } } return headers; }; const headers = configs && Array.isArray(configs.includeFields) && configs.includeFields.length > 0 ? headersToInclude(Collection.schema, configs.includeFields) : generateHeaders(Collection.schema); worksheet.columns = headers.map((key) => { return { header: key, key: key }; }); results.forEach((item) => { const rowData = {}; headers.forEach((key) => { rowData[key] = deepGet(item, key); }); worksheet.addRow(rowData); }); const buffer = await workbook.xlsx.writeBuffer(); res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.setHeader('Content-Disposition', `attachment; filename=${Collection.modelName}.xlsx`); res.send(buffer); } catch (e) { return Response.error(req, res, e); } } } const deepGet = (obj, path) => { const keys = path.split('.'); let value = obj; for (const key of keys) { if (!value || typeof value !== 'object') { return undefined; } value = value[key]; } return value; };