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