使用rails& amp;将excel表(.xls)提供给浏览器下载角

时间:2017-04-07 05:35:40

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

我正在使用电子表格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”并尝试下载。
  4. 所有尝试都失败了,因为我遗漏了一些东西。欢迎提出所有建议。

1 个答案:

答案 0 :(得分:0)

filename = "/path/to/file/sheet.xls"
tempfile = Tempfile.new(filename)
workbook = Spreadsheet::Workbook.new
...
workbook.write(tempfile.path)
send_file tempfile.path, :filename => filename