记录一下最近想实现的一个功能,数据导出为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()
}
实际使用
点击下载文件按钮
打开文件
以上就是我实现mongodb导出Excel文件的思路与方法,希望能够帮助到你!
参考链接:
非常感谢这位大佬提供的方法!!! 十分钟上手 xlsx,4 种方法实现 Excel 导入导出