express+mongodb实现Excel文件导出

691 阅读2分钟

记录一下最近想实现的一个功能,数据导出为Excel文件

思路:

1.查找mongodb模型的数据
2.将获取到的数据转化为一个二维数组
3.使用xlsx插件转化为二进制文件
4.设置对应响应头,返回给到前端
5.前端使用file-saver接受二进制文件下载到本地

后端

先安装xlsx插件

# npm install xlsx

控制器方法

// 导入数据模型
const Movie = require('../models/movie')

exports.admin_downloadMovie = [
	(req, res) => {
                // 判断用户token是否是管理员
		if(req.auth.userAdmin){
                // 表头需要对准每一列的数据 也就是key值顺序 要不然会导致对不上每一列
			exportFile(res,Movie,{_id :0,__v:0},
				["序号","电影名称","电影封面","电影tag",
                                "上映地区","电影时长","电影简介",
                                "电影下载路径","上映时间","点赞数",
                                "下载数","是否主页推荐"]))
		}
	  }
]

exportFile响应方法

/**
 * 直接返回文件
 * @param res response对象
 * @param model 数据模型
 * @param skip 需要忽略的数据
 * @param header 列名
 * @returns empty
 */
  function exportFile(res,model,skip,header) {
	model.find({},skip).exec((err,find) => {
		const fileBuffer = exportExcelFromData(find, '表1',header)
                // 设置响应头
		res.header("Access-Control-Allow-Origin","*")
		res.header('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
		res.send(Buffer.from(fileBuffer, 'binary'))
                return 
	})
  }

exportExcelFromData转化为二进制文件函数

 // 导入插件
 const xlsx = require('xlsx')
 /**
 * 将数据转成 excel
 * @param arrays 对象数组
 * @param sheetName 表名
 * @param header 列名
 * @returns 二进制文件对象
 */
 function exportExcelFromData(arrays, sheetName = '表1',header) {
	// 转化为二维数组
        // 使用aoa_to_sheet方法转化的话 数组的第一个会被当成表头使用 也就是第一行
	let arr = [header]
        // 拿到key值数组
	let keys = Object.keys(arrays[0]._doc) || []
        // 循环push进数组里
	arrays.forEach((x,index) => {
		let temp = [index + 1]
		keys.forEach(y => {
			temp.push(x[y])
		})
		arr.push(temp)
	})
	/* 使用json_to_sheet方法遍历原始对象数组不行 
           因为mongodb获取到的数据里每个对象里面只有._doc属性能够拿到数据 */
	const jsonWorkSheet = xlsx.utils.aoa_to_sheet(arr)
        // 配置数据
	const workBook = {
	  SheetNames: [sheetName],
	  Sheets: {
		[sheetName]: jsonWorkSheet,
	  }
	}
        // 返回二进制文件对象
	return xlsx.write(workBook, {type: 'binary'})
  }

前端

安装file-saver插件

# npm install file-saver

使用插件保存后端返回的二进制文件

import { ElMessage,ElLoading } from "element-plus"
import { saveAs } from 'file-saver'
import axios from 'axios'
// 下载Excel文件
const http = axios.create({ baseURL: "http://localhost:3000" })
const serverDataToExcel = async () => {
      // 显示全页加载态
      const loading = ElLoading.service({
		lock: true,
		text: "Loading",
		background: "rgba(0, 0, 0, 0.7)"
      })
      let response
      try {
	  response = await http.get('/admin/download/movie', {
	  responseType: "blob", // 接受类型为二进制文件
	  headers: {
	      Authorization: sessionStorage.getItem("token")
              }
          })
      } catch (err) {
	  loading.close()
	  return ElMessage.error("下载失败")
      }
      // 保存接收到的文件
      saveAs(response.data, '电影数据.xlsx')
      // 关闭加载态
      loading.close()
}

实际使用

image.png

点击下载文件按钮

image.png

打开文件

image.png

以上就是我实现mongodb导出Excel文件的思路与方法,希望能够帮助到你!

参考链接:

非常感谢这位大佬提供的方法!!! 十分钟上手 xlsx,4 种方法实现 Excel 导入导出