【问题标题】:Axlsx Rails. Generate .xlsx file and respond filename as json/htmlAxlsx 导轨。生成 .xlsx 文件并将文件名响应为 json/html
【发布时间】:2014-07-04 13:31:55
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails json export-to-excel axlsx


    【解决方案1】:

    在对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
    

    【讨论】:

    • 我写了axlsx_rails。它的响应处理程序尝试呈现和提供电子表格,所以你说得对。
    • 您可以做的是使用模板处理程序将模板呈现为字符串并将其写入文件。仅当您希望电子表格代码在可以以任何方式提供的模板中时才会有用。 See the axlsx_rails Mailer example
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。我的解决方案也有效,但我将此标记为正确答案,因为使用模板对我来说比使用许多辅助函数更可取。我有很多工作表,所以我会将它们分别保存在单独的部分/模板中。
    • 嗨 @noel 你好 - 我在 rspec 中遇到了这个错误:ActionController::UnknownFormat:。有什么想法吗?
    • @BKSpureon 你能在 github 上创建一个更详细的问题吗?这个问题有几个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2016-09-26
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多