使用axlsx-rails生成Excel报表遇ActionController::UnknownFormat错误求助
搞定axlsx-rails导出Excel时的406 Not Acceptable错误
嘿,这个406错误我之前也碰到过,本质就是Rails控制器找不到能处理你请求格式的方法。咱们一步步来排查解决:
1. 先把导出按钮的请求格式搞对
你视图里的导出按钮得明确告诉Rails:“我要xlsx格式的响应”。如果是用表单提交的话,得给按钮加个format参数;用链接的话更直接。
举个表单的例子:
<%= form_tag reports_path, method: :get do %> <!-- 你的搜索输入框 --> <%= text_field_tag :keyword, params[:keyword] %> <!-- 搜索按钮,正常返回HTML --> <%= submit_tag "搜索", name: nil %> <!-- 导出Excel的按钮,这里要带上format参数 --> <%= submit_tag "导出Excel", name: nil, params: { format: :xlsx } %> <% end %>
要是觉得表单按钮麻烦,用link_to更省心(适合GET请求的导出):
<%= link_to "导出Excel", reports_path(params.merge(format: :xlsx)), class: "btn btn-primary" %>
这样请求里就会带上format=xlsx,Rails就知道该处理xlsx格式了。
2. 让控制器支持xlsx格式响应
你的控制器index动作里必须明确处理xlsx格式,还要对应好模板。比如:
def index @reports = Report.where(...) # 你的搜索逻辑,和HTML视图共用就行 respond_to do |format| format.html # 处理HTML请求,对应index.html.erb format.xlsx do # 可以自定义下载的文件名,比如加上日期 response.headers['Content-Disposition'] = "attachment; filename=\"报表_#{Date.today}.xlsx\"" end end end
然后别忘了在app/views/[你的控制器名]/下面创建index.xlsx.axlsx模板文件,写生成Excel的逻辑:
wb = xlsx_package.workbook wb.add_worksheet(name: '搜索结果') do |sheet| # 先加表头 sheet.add_row ['ID', '名称', '创建时间'] # 遍历数据加行 @reports.each do |report| sheet.add_row [report.id, report.name, report.created_at.strftime('%Y-%m-%d')] end end
3. 检查路由有没有限制格式
默认的resources路由是支持所有格式的,但如果是自定义路由,得确保没限制死格式:
# config/routes.rb resources :reports # 这个没问题,默认支持index的各种格式 # 要是自定义路由的话,别加format限制 get 'reports', to: 'reports#index', defaults: { format: nil }
4. 确认gem依赖装对了
你提到了rubyzip和axlsx(从git拉取),但别忘了axlsx-rails这个gem!把它也加到Gemfile里:
gem 'rubyzip', '>= 1.2.1' gem 'axlsx', git: '你的git仓库地址' gem 'axlsx-rails'
然后跑bundle install确保所有依赖都装好了。
5. 手动确认MIME类型
有时候Rails可能没正确注册xlsx的MIME类型,你可以在初始化文件里手动加一下:
# config/initializers/mime_types.rb Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx
不过axlsx-rails一般会自动处理这个,但Rails5.1版本保险起见可以加一下。
6. 直接测试URL
你可以在浏览器里直接访问/reports.xlsx?keyword=你的搜索关键词,如果能下载文件,说明是表单按钮的问题;如果还是406,那就是控制器或者路由的问题,再回头检查上面的步骤。
内容的提问来源于stack exchange,提问作者Ernesto G
相关产品推荐
相关产品推荐

