【问题标题】:Serving excel sheet (.xls) to browser for download using rails & angular使用 rails 和 angular 将 excel 表 (.xls) 提供给浏览器以供下载
【发布时间】:2017-04-07 05:35:40
【问题描述】:

我正在使用电子表格 gem 来生成 .xls 文件。将其写入文件后,我正在尝试发送到客户端浏览器进行下载。

下面是rails中的代码

workbook = Spreadsheet::Workbook.new
# Constructed the data
file = "/path/to/file/sheet.xls"
workbook.write file
send_file file

此文件在打开时包含理想格式的预期数据。

下面是js中的代码:

CustomRestService.custom_post("report",{report_data: angular.toJson($scope.report_data)},"download_xls",{}).then (data)->
    if data
      hiddenElement = document.createElement('a')
      angular.element(document.body).append(hiddenElement)
      hiddenElement.href = 'data:attachment/xls,' + encodeURI(data)
      hiddenElement.target = '_blank'
      hiddenElement.download = "report.xls"
      hiddenElement.click()
      hiddenElement.remove()

但是在浏览器中下载的文件包含垃圾数据。我尝试了多种解决方案,如下所示:

  1. 使用 send_data,而不是 send_file
  2. 生成xls数据写入StringIO对象直接下载
  3. 在 js 中构造 Blob 对象,类型为“application/vnd.ms-excel”并尝试下载。

所有尝试都失败了,因为我遗漏了一些东西。欢迎所有建议。

【问题讨论】:

    标签: ruby-on-rails angularjs ruby excel spreadsheet


    【解决方案1】:
    filename = "/path/to/file/sheet.xls"
    tempfile = Tempfile.new(filename)
    workbook = Spreadsheet::Workbook.new
    ...
    workbook.write(tempfile.path)
    send_file tempfile.path, :filename => filename
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加 context 将改善答案的长度长期价值。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2015-01-19
    • 2017-10-09
    • 2021-09-24
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    相关资源
    最近更新 更多