rails excel mime-type - 如何更改默认文件名?

时间:2012-07-24 08:47:34

标签: ruby-on-rails mime-types railscasts

我跟着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

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

谢谢..

3 个答案:

答案 0 :(得分:24)

我相信你的答案就在这里:in rails, how to return records as a csv file

使用标头设置文件名。

headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 

答案 1 :(得分:5)

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

此链接more detail change the file name excel

答案 2 :(得分:2)

我希望你实际看到的是视图名称sans .erb,不一定是控制器动作。

如果你想要那种控制水平,你可以做三件事。

  • 使用来自控制器的send_data调用,使用制表符分隔数据,如使用文件名转换的轨道所示:选项

e.g。

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引入的旧的适当的电子表格语言,但如果您的用户群被锁定在MS-OFFICE,我认为没有人会注意到。

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

我知道,因为我是作者或axlsx,还有那些限制,缺乏样式,图表和验证,这些都是我开始创作axlsx的原因。

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

acts_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