express中实现将mysql中的数据导出为excel

express中实现将mysql中的数据导出为excel

安装node-excel

javascript 复制代码
cnpm install node-xlsx -S

封装公用的导出方法

javascript 复制代码
/**
 * 查询
 * @param tableName: 表名
 * @param sqlJson:需要拼接的SQL
 * @returns {Promise<unknown>}
 */
const find = (tableName, sqlJson) => {
  return new Promise((resolve, reject) => {
    const sql = sqlJson ? `SELECT * FROM ${tableName} WHERE ${sqlJson}` : `SELECT * FROM ${tableName}`
    pool.query(sql, (error, results) => {
      if (error) {
        reject({
          status: false,
          msg: error
        })
        logger.error(JSON.stringify(error))
      } else {
        resolve({
          status: true,
          data: results
        })
      }
    })
  })
}
/**
 * 导出
 * @param tableName: 表名
 * @param tableHeader:excel表头信息
 * @param sqlJson:需要拼接的SQL语句
 * @returns {Promise<unknown>}
 */
const exportTableDataToExcel = (tableName, tableHeader, sqlJson) => {
  return new Promise((resolve, reject) => {
    find(tableName, sqlJson).then(({ status, msg, data }) => {
      if (status && data.length > 0) {
        // 定义excel表格的表头和内容
        const excelData = [
          tableHeader,
          ...data.map(item => Object.values(item))
        ]
        // 使用node-xlsx模块生成excel文件
        const buffer = xlsx.build([{ name: 'Sheet1', data: excelData }])
        resolve({
          status: true,
          data: buffer
        })
      } else {
        reject({
          status: false,
          msg: msg || '导出失败!'
        })
      }
    }).catch(err => {
      reject({
        status: false,
        msg: err || '导出失败!'
      })
    })
  })
}

node-xlsx需要的数据格式

javascript 复制代码
const excelData = [
	['日志主键', '模块标题',...],
	[1, 'test1',...],
	[2, 'test2',...]
]

编写导出excel接口

javascript 复制代码
exportFile(req, res) {
    const tableHeader = ['日志主键', '模块标题', '业务类型', '方法名称', '请求方式', '操作类别', '操作人员', '部门名称', '请求URL', '主机地址', '操作地点', '请求参数', '返回参数', '操作状态', '错误消息', '操作时间']
    exportTableDataToExcel('sys_oper_log', tableHeader, null).then(({ status, msg, data }) => {
      if (status && data) {
        // 设置返回的http header信息,告诉浏览器该文件是一个excel文件
        res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8')
        res.setHeader('Content-Disposition', 'attachment; filename=' + encodeURIComponent('导出数据.xlsx'))
        // 将生成的excel文件发送给客户端
        res.send(data)
      } else {
        res.sendError(msg || '导出操作日志失败!')
      }
    }).catch(err => {
      res.sendError(err || '导出操作日志失败!')
    })
  }

编写swagger注释

javascript 复制代码
/**
 * @swagger
 * /operlog/export:
 *   post:
 *     tags:
 *       - 操作日志-导出操作日志
 *     summary: 导出操作日志
 *     produces:
 *       - application/json
 *     responses:
 *       200:
 *         description: 成功
 *       400:
 *         description: 失败
 *     security:
 *       - Authorization:
 */
router.post('/export', exportFile)

apifox调用接口

swagger-ui调用接口

下载文件效果

参考链接

参考链接1
参考链接2

相关推荐
尽兴-3 小时前
《深入剖析:全面理解 MySQL 的架构设计》
数据库·mysql·数据库架构设计·理解mysql架构
梦幻通灵4 小时前
Mysql字段判空实用技巧
android·数据库·mysql
To Be Clean Coder5 小时前
【Spring源码】getBean源码实战(三)
java·mysql·spring
IT技术分享社区5 小时前
数据库实战:MySQL多表更新JOIN操作的底层原理与性能调优指南
数据库·mysql·程序员
UrSpecial6 小时前
InnoDB存储引擎
数据库·mysql
gjc5927 小时前
MySQL隐蔽 BUG:组合条件查询无故返回空集?深度排查与规避方案
android·数据库·mysql·bug
jiayong237 小时前
Excel数据处理详细文档02
excel
Micro麦可乐7 小时前
分词搜索必须上Elasticsearch?试试MySQL分词查询,轻松满足大多数搜索场景的需求
大数据·mysql·elasticsearch·分词搜索·分词查询
a187927218317 小时前
MySQL 事务
数据库·mysql·事务·mvcc·acid·readview·可见性判断算法
开开心心就好8 小时前
OCR识别工具可加AI接口,快捷键截图翻译便捷
java·网络·windows·随机森林·电脑·excel·推荐算法