Axlsx Rails。 生成.xlsx文件并将文件名作为json / html响应

我用axlsx_rails gem生成xlsx文件。

收集用户输入后,我将数据发布到/basic_report_post.xlsx

控制器动作看起来像

 def basic_report_post @config = params[:config] @data = params[:data] @filename = "#{Rails.root}/public/test.xlsx" respond_to do |format| format.xlsx { render xlsx: 'basic_report_post' } end end 

查看此操作的文件basic_report_post.xlsx.axlsx

 wb = xlsx_package.workbook wb.add_worksheet(name: 'Data1') do |s| # Drawing columns end xlsx_package.serialize @filename 

我的问题是我收到了原始.xlsx文件的响应数据(在后成功操作中)。 但我需要以某种方式回复@filename (格式json / html)以便下载它。

可以使用axlsx_rails模板渲染器创建字符串并将其保存到文件:

 def basic_report_post @config = params[:config] @data = params[:data] @filename = "#{Rails.root}/public/test.xlsx" File.open(@filename, 'w') do |f| f.write render_to_string(handlers: [:axlsx], formats: [:xlsx], template: 'path/to/template') end render json: {name: @filename} end 

然后,如果需要,您可以使用模板直接提供文件。

在使用respond_to进行一些实验后,我移动.xlsx生成逻辑来查看帮助器。

所以我在控制器中包含了BasicReportHelper

basic_report_helper.rb

 module BasicReportsHelper def generate_basic_report(filename) p = Axlsx::Package.new wb = p.workbook wb.add_worksheet(:name => "Basic Worksheet") do |sheet| # Drawing here end p.serialize filename end end 

将后调用更改为/basic_report_post.json并将操作更改为

 def basic_report_post @config = params[:config] @data = params[:data] @filename = "#{Rails.root}/public/test.xlsx" generate_basic_report(@filename) respond_to do |format| format.json { render json: {name: @filename} } end end