目前在项目中,需要将table表格导出为xlsx文件,由于之前都是Java服务端同学实现,这次自己试着使用Koa服务,搭配node-xlsx的插件实现。
const nodeXlsx = require('node-xlsx')
ArticleRouter.get('/export', async ctx => {
try {
// 0代表不查出来的字段, 1代表是查出来的字段
const list = await ArticleSchema.find({}, { _id: 0, userName: 1, publishTime: 1, contentType: 1 }).exec()
// 格式化数组
const valuesArr = list.map(item => [item.userName, item.contentType, moment(item.publishTime).format('YYYY-MM-DD HH:mm:ss')])
valuesArr.unshift(['用户名', '内容类型', '发布时间'])
// 转化为二进制的buffer数据流
const bufferData = nodeXlsx.build([{ name: '报表', data: valuesArr }])
const lodashCount = lodash.uniqueId()
ctx.body = {
code: 200,
message: lodashCount
}
// 命名不同的文件名,否则报错
fs.writeFileSync(`${__dirname}/downloads/xlsx_${lodashCount}.xlsx`, bufferData)
} catch (error) {
ctx.body = {
code: 500,
message: '导出失败',
error
}
}
})
根据以上接口,文件就上传到了服务器的指定目录下,怎么在前端拿到这个文件的路径呢?需要进行文件映射,root代表在前端访问的url中包含/downloads时,会定位到服务器的/usr/share/nginx/service/database/api目录下,寻找downloads文件夹。
autoindex属性代表是否开启文件索引,默认不开启,设置为on就代表像访问文件浏览器一样访问文件。

服务端配置完成之后,之后就是前端的工作了
async handleExportXlsx () {
const res = await this.$http.get('/article/export')
if (res.code === 200) {
exportFile(`https://xxx/downloads/xlsx_${res.message}.xlsx`)
}
}
// 导出文件封装的方法
export const exportFile = (url) => {
const downloadFileA = document.createElement('a')
document.body.appendChild(downloadFileA)
downloadFileA.style.display = 'none'
downloadFileA.rel = 'noopener noreferrer'
downloadFileA.href = url
downloadFileA.download = '下载文件'
downloadFileA.click()
document.body.removeChild(downloadFileA)
}
网友评论