美文网首页
前端怎么怎么搭配Koa2服务实现.xlsx文件导出?

前端怎么怎么搭配Koa2服务实现.xlsx文件导出?

作者: cs0710 | 来源:发表于2019-02-25 09:59 被阅读2次

目前在项目中,需要将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就代表像访问文件浏览器一样访问文件。

图片.png

服务端配置完成之后,之后就是前端的工作了

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)
}

相关文章

网友评论

      本文标题:前端怎么怎么搭配Koa2服务实现.xlsx文件导出?

      本文链接:https://www.haomeiwen.com/subject/qrrwyqtx.html