2

我正在使用 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)来下载它。

4

2 回答 2

3

可以使用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

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

于 2014-06-10T16:27:46.303 回答
0

经过一些实验后,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
于 2014-05-15T22:48:15.960 回答