Adonis JS中实现Excel下载的方法及简化方案咨询
更简便的AdonisJS Excel下载实现方式
当然有更简便的实现方式,下面从优化现有ExcelJS代码、替换轻量库、使用AdonisJS专用工具三个方向给出方案:
一、优化现有ExcelJS代码
原代码存在冗余逻辑和潜在报错风险,优化后更简洁健壮:
const filename = request.input('filename', 'users') // 增加默认值,避免空文件名 const users = await User.all() // 处理空数据,防止users[0]报错 if (!users.length) { return response.status(400).send('无数据可导出') } // 简化表头生成逻辑 const columns = Object.keys(users[0].$attributes).map(key => ({ header: key[0].toUpperCase() + key.slice(1), key, width: 32 })) const workbook = new ExcelJS.Workbook() const worksheet = workbook.addWorksheet(filename) worksheet.columns = columns // 用addRows批量添加行,替代forEach循环,更高效简洁 worksheet.addRows(users.map(user => user.$attributes)) const buffer = await workbook.xlsx.writeBuffer() // 用AdonisJS内置的attachment方法简化响应头设置 response.header('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response.attachment(`${filename}.xlsx`) return response.send(buffer)
优化点说明:
- 给文件名加默认值,避免异常
- 增加空数据判断,防止数组越界报错
- 批量添加行,减少循环代码
- 用框架内置方法简化响应头配置
二、用轻量库SheetJS(xlsx)实现(无复杂样式需求时)
如果不需要列宽、单元格格式等复杂样式,用xlsx库(SheetJS)更轻便,代码量更少:
先安装依赖:
npm install xlsx
实现代码:
const XLSX = require('xlsx') const filename = request.input('filename', 'users') const users = await User.all() if (!users.length) { return response.status(400).send('无数据可导出') } // 直接将JSON数据转为工作表 const worksheet = XLSX.utils.json_to_sheet(users.map(u => u.$attributes)) // 手动修改表头为首字母大写(可选) const originalHeaders = XLSX.utils.sheet_to_json(worksheet, { header: 1 })[0] const formattedHeaders = originalHeaders.map(h => h[0].toUpperCase() + h.slice(1)) XLSX.utils.sheet_add_aoa(worksheet, [formattedHeaders], { origin: 'A1' }) // 生成工作簿并导出buffer const workbook = XLSX.utils.book_new() XLSX.utils.book_append_sheet(workbook, worksheet, filename) const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' }) response.header('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response.attachment(`${filename}.xlsx`) return response.send(buffer)
这个方案优势是库体积小、代码简洁,适合只需要基础导出功能的场景。
三、AdonisJS专用工具包(长期项目推荐)
如果是AdonisJS v5项目,可以使用社区维护的@adonisjs/excel包(基于ExcelJS封装),进一步简化代码:
安装配置完成后,代码可以简化为:
const filename = request.input('filename', 'users') const users = await User.all() if (!users.length) { return response.status(400).send('无数据可导出') } return response.download( await Excel.export('xlsx', users.map(u => u.$attributes), { sheet: filename, columns: Object.keys(users[0].$attributes).map(key => ({ header: key[0].toUpperCase() + key.slice(1), key, width: 32 })) }), `${filename}.xlsx` )
这个工具包封装了ExcelJS的常用操作,减少重复代码,适合长期在AdonisJS项目中使用。
内容的提问来源于stack exchange,提问作者Adonis js
相关产品推荐
相关产品推荐

