4

我按照http://railscasts.com/episodes/362-exporting-csv-and-excel 并在我的 Rails 应用程序中设置了 Excel 下载。

我的控制器代码如下所示:

  def show
    @project = Project.find(params[:id])
    @project.tasks.order(:name)
    respond_to do |format|
      format.html
      format.json { render json: @project }
      format.xls
    end
  end

在我看来,我创建了下载 excel 文件的链接,如下所示:

.dl_xls= link_to "Download xls", url_for(:format => 'xls')

现在生成的 excel 文件总是像Project记录的 id 一样命名,例如80.xls

有没有办法改变这种行为并给它一个自定义名称?

谢谢..

4

3 回答 3

25

我相信你的答案就在这里:在 Rails 中,如何将记录作为 csv 文件返回

使用标题来设置文件名。

headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 
于 2012-07-24T10:13:11.863 回答
7
def index
  @tabulars = Tabular.all
  filename = "data_users.xls"
  respond_to do |format|
    format.html
    format.xls { headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" }
  end
end

此链接更详细更改文件名 excel

于 2013-05-19T00:58:19.247 回答
2

我希望您实际看到的是没有 .erb 的视图名称,不一定是控制器操作。

如果你想要那种程度的控制,你可以做三件事。

  • 使用来自控制器的 send_data 调用和制表符分隔的数据,如带有文件名的 rails cast 所示:选项

例如

class ProductsController < ApplicationController
  def index
    @products = Product.order(:name)
    respond_to do |format|
      format.html
      format.csv { send_data @products.to_csv }
      format.xls { send_data @products.to_csv(col_sep: "\t"), filename: 'your_file_name.xls'}
    end
  end
end

这种方法以及 railscast 引入的旧式电子表格ML 语言存在问题,但如果您的用户群被锁定在 MS-OFFICE 中,我认为没有人会注意到。

  • 或者,您可以使用像 act_as_xlsx 或 axlsx_rails 这样的 gem 来消耗 axlsx gem。这些工具生成经过验证的 xlsx 数据(也称为 Office Open XML / ECMA-376 - 或 MS 自 2007 年以来一直在使用的...),并且与其他现代电子表格软件(如 Numbers、GoogleDocs、LibraOffice)具有相当好的互操作性。我相信你在 railscast 中注意到了所有与此相关的评论。

我知道,因为我是作者或 axlsx,而这些限制,以及缺乏样式、图表和验证,是我最初创作 axlsx 的原因。

更多信息:axlsx:https ://github.com/randym/axlsx

act_as_xlsx: http ://axlsx.blogspot.jp/2011/12/using-actsasxlsx-to-generate-excel-data.html

  • 编写自己的响应器/渲染器

axlsx_rails 也是一个很好的例子,说明如何编写自己的渲染器和响应器,以便您可以使用标准的 rails 视图,但重命名下载的文件。

https://github.com/straydogstudio/axlsx_rails/blob/master/lib/axlsx_rails/action_controller.rb

于 2012-07-24T10:12:54.337 回答