You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:27:50