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

news/2024/7/21 6:59:05 标签: express, mysql, excel

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

excel_1">安装node-excel

cnpm install node-xlsx -S

在这里插入图片描述

封装公用的导出方法

/**
 * 查询
 * @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需要的数据格式

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

excel_78">编写导出excel接口

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注释

/**
 * @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


http://www.niftyadmin.cn/n/5263672.html

相关文章

逻辑回归的损失函数和目标函数

损失函数 逻辑回归通常使用对数损失函数&#xff08;Log Loss&#xff09;&#xff0c;也称为逻辑损失或交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;。对于单个样本&#xff0c;对数损失函数定义如下&#xff1a; 对于样本 (x, y) &#xff0c;其中 ( y ∈ 0 , 1…

【FPGA/verilog -入门学习12】Verilog可配置的PWM设计,参数传递的3种方式

需求&#xff1a; 基于任务&#xff08;task&#xff09;的PWM设计仿真验证 需求分析&#xff1a; 1,需求实现可配置PWM输出&#xff08;频率&#xff0c;占空比&#xff09; 2,输入&#xff0c;输出端口 input i_clk, //clk 50Mhz input i_rst_n, input i_en, output…

第一次使用ThreadPoolExecutor处理业务

通过对业务逻辑的分析&#xff0c;进行编码&#xff0c;先把第一条sql查出来的数据进行分组&#xff0c;然后分别使用不同的线程去查询数据返回&#xff0c;并添加到原来的数据中。 总感觉哪里写的不对&#xff0c;但是同事们都没用过这个&#xff0c;请大家指教一下&#xff…

C++高性能服务器框架muduo,与配套书籍《Linux多线程服务端编程》解读

本章解读C开源项目 muduo 代码&#xff0c;与配套书籍《Linux多线程服务端编程》&#xff0c;均来自作者陈硕&#xff0c;是业内比较有名的大神。 目录 muduo 源码解读《Linux多线程服务端编程》笔记第1章 线程安全的对象生命周期管理第2章 线程同步精要第3章 多线程服务器的适…

【普中】基于51单片机简易计算器显示设计( proteus仿真+程序+设计报告+实物演示+讲解视频)

目录标题 &#x1f4df;1. 主要功能&#xff1a;&#x1f4df;2. 讲解视频&#xff1a;&#x1f4df;3. 设计说明书(报告)&#x1f4df;4. 仿真&#x1f4df;5. 实物烧录和现象&#x1f4df;6. 程序代码&#x1f4df;7. 设计资料内容清单 【普中开发板】基于51单片机简易计算器…

springboot 拦截器之Advisor不生效问题

SPringBoot使用方法注解拦截器时遇到不生效问题记录&#xff1a; 定义方法注解 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface DataScope {boolean enable() default true;}定义 Advisor Getter…

2019年第八届数学建模国际赛小美赛B题数据中心冷出风口的设计解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 B题 数据中心冷出风口的设计 原题再现&#xff1a; 这是数据中心空调设计面临的一个问题。在一些数据中心&#xff0c;计算机机柜是开放的&#xff0c;在一个房间里排列成三到四排。冷却后的空气通过主管进入房间&#xff0c;并分为三到四个…

cfa一级考生复习经验分享系列(二)

本人学历背景&#xff1a;毕业于普通二本学校&#xff0c;本科专业为金融学&#xff0c;所以还算是有一定的基础&#xff0c;今年19年6月份参加了cfa一级的考试&#xff0c;最终通过了一级的考试&#xff0c;虽然成绩一般&#xff0c;但是已经知足了&#xff0c;因为自己复习的…