nodejs下载excel,怎么在前端请求并保存成xlsx文件?

比如我的node端是这样写的:

clipboard.png

或者使用exceljs 生成的

clipboard.png

按照正常的逻辑,我在前端请求这个地址就可以直接下载这个excel文件的,但是不行啊。

我又在网上搜,说是要写成这样:

clipboard.png

点击一个按钮,然后发送请求,上面是请求那个node端接口后,执行的代码。

是可以请求到的

clipboard.png

这是打印出来的response

clipboard.png

可以下载文件,这个文件是这样的

clipboard.png

怎么解决?或者有更好的办法么?

哦, 直接在node端 生成excel ,我也试过了,哎、、、、


更新

现在我是这样写的
clipboard.png

文件也是可以生成的

clipboard.png

但是前端怎么请求呢?

前端我用的react写的,
点击一个按钮,
现在用a链接,form都不好使

clipboard.png

页面都会跳转

对了,为了支持前端路由

node端 还应用了connect-history-api-fallback

clipboard.png

clipboard.png

求大神指点啊,

感谢,感谢

阅读 10.2k
6 个回答

正好前端时间我也有个node生成xlsx,前端下载的需求。

我贴一下nodejs的代码,你可以参考一下:

const buffer = xlsx.build([{ name: "coverSheet", data: excelData }]);
const fileName = new Date().getTime() + '.xlsx'
const filtPath = path.resolve(__dirname, '../', fileName)
fs.writeFileSync(filtPath, buffer, 'binary');
res.sendFile(filtPath)

前端我并没有采用Blob去下载文件,考虑到兼容性,所以使用的form表单提交,可以实现浏览器下载文件。

另外我觉得最简单的办法就是node生成xlsx文件,然后浏览器直接通过url下载。但是看你的说明,也尝试过不过没成功。我怀疑是你并没有把生成的xlsx所在目录设置为资源目录,导致浏览器找不到该位置。

---- 第一次更新 ----
我可以贴一下我这前端form下载的代码供你参考,无跳转。

// 前端
function download(url, params){
  let tempForm = document.createElement('form')
  tempForm.action = url
  tempForm.method = 'post'
  tempForm.style.display = 'none'
  for (var x in params) {
      let opt = document.createElement('textarea')
      opt.name = x
      opt.value = params[x]
      tempForm.appendChild(opt)
  }
  document.body.appendChild(tempForm)
  tempForm.submit()
  return tempForm
}

如果直接下载文件,确实是要改connect-history-api-fallback的,增加一条rewrites才可以。

这个需求我们就是一个a链接的href指向这个地址并带上相关参数就可以了(比如www.baidu.com? a = 1 & b = 2说白了就是个get请求),后端根据参数查询相关数据写入excel,然后把文件写到服务器上。我觉得是你node端没有处理好这个数据,逻辑是没有问题的。

你试试用这个模块操作excel (node-xlsx)

新手上路,请多包涵

node中使用node-xlsx中间件保存为xlsx格式的,需要保存的data类型是数组,前端再用a连接去指向保存后的地址。
const xlsx = require('node-xlsx').default
var buffer = xlsx.build([{name: "mySheetName", data: newArr}]);
fs.writeFileSync(Math.random()+".xlsx", buffer,"binary")

感谢大家。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏