【问题标题】:Rails - Export records to downloadable excel file using axlsx gem (Keep MVC)Rails - 使用 axlsx gem 将记录导出到可下载的 excel 文件(保持 MVC)
【发布时间】:2014-07-26 01:48:23
【问题描述】:

我已经从https://github.com/randym/axlsx成功安装了axlsx gem 这是我用来通过这个 gem 创建一个 excel 文件的控制器代码。

但是这段代码没有任何反应,而是显示了一个错误未初始化的 mime

class Coaches::PaymentsController < ApplicationController

  before_filter :authenticate_coach!

  # List all the payments
  def index
    if !params[:sort].blank?
      @payments = Payment.includes(:member).paginate(:page => params[:page], :order => sort_column + " " + sort_direction)
    else
      @payments = Payment.includes(:member).paginate(:page => params[:page], :order=>'id desc')
    end
    respond_to do |format|
      format.html
      # Change format to xlsx
      format.xlsx
      format.json { render json: @payments }
    end
  end
end

其次,我尝试使用以下代码:

wb = xlsx_package.workbook
wb.add_worksheet(name: "Buttons") do |sheet|
  @buttons.each do |button|
    sheet.add_row [button.name, button.category, button.price]
  end
end

但不幸的是,它不起作用。谁能告诉我只是提示而不是解决我的任务?

按照建议我已经尝试了第三次:

   def index
    if !params[:sort].blank?
      @payments = Payment.includes(:member).paginate(:page => params[:page], :order => sort_column + " " + sort_direction)
    else
      @payments = Payment.includes(:member).paginate(:page => params[:page], :order=>'id desc')
    end
    respond_to do |format|
      format.xlsx do
        p = Axlsx::Package.new
        wb = p.workbook
        wb.add_worksheet(name: "Your worksheet name") do |sheet|
          sheet.add_row ["First Column", "Second", "Third"]
          sheet.add_row [1, 2, 3]
          sheet.add_row [' preserving whitespace']
        end
        send_data p.to_stream.read, type: "application/xlsx", filename: "filename.xlsx"
      end
    end
  end

它抛出了 http 406 错误

【问题讨论】:

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


    【解决方案1】:

    尝试使用带有模板的axlsx_rails Gem。 就我而言,我使用以下配置使其工作。还有一个扩展名为 .xlsx 的链接,以 xlsx 格式呈现。

    宝石文件

    gem 'axlsx', '~> 2.0'
    gem "axlsx_rails"
    

    控制器文件-payments_controller.rb

    def download
        @payments = Payment.all
        respond_to do |format| 
           format.xlsx {render xlsx: 'download',filename: "payments.xlsx"}
        end
    end
    

    查看文件-download.xlsx.axlsx

    wb = xlsx_package.workbook
    wb.add_worksheet(name: "Payments") do |sheet|
        sheet.add_row ["ID", "Notes","Amount($)","Deposit Date"]
        @payments.each do |payment|
            sheet.add_row [payment.id, payment.notes,payment.amount,payment.date_deposite]
        end
    end
    

    【讨论】:

    • 这是导出到excel的最佳选择,它保留了MVC
    • 大大节省了 mime 时间。
    【解决方案2】:

    为防止未初始化的 mime 类型错误,添加以下文件:

    # config/initializers/mime_types.rb
    
    Mime::Type.register "application/xlsx", :xlsx
    

    以下是下载 xlsx 文件的简短示例:

    format.xlsx do
      p = Axlsx::Package.new
      wb = p.workbook
      wb.add_worksheet(name: "Your worksheet name") do |sheet|
        # Add your stuff
      end
      send_data p.to_stream.read, type: "application/xlsx", filename: "filename.xlsx"
    end
    

    【讨论】:

    • Daniel 我在 mime 中添加了代码仍然有 406 错误
    • @DineshSaini 您请求 xlsx 文件的格式是什么?响应是否作为 XLSX 处理?你能告诉我们请求的堆栈跟踪吗?
    • 我没有什么特别的,所有的代码都写在上面。如果您需要任何其他代码,请告诉我。
    • @DineshSaini 能否包含失败请求的堆栈跟踪?
    • 它不显示错误。只是带有 406 错误的简单页面。任何其他获取堆栈的方式
    【解决方案3】:

    请将 render false 设置为 HTML 并避免使用 JSON,而是使用 XLS,对于跟踪,您可以看到启动 rails 的终端。

    【讨论】:

      【解决方案4】:
      gem 'axlsx', '~> 2.0'
      gem "axlsx_rails"
      

      【讨论】:

      • 对,因为需要锁定版本才能支持ROR 3.2.6
      【解决方案5】:

      我使用宝石。

      gem 'axlsx', '~> 2.0'
      gem "axlsx_rails"
      

      但是这些宝石出现了错误。 当我从 Gemfile.lock 中删除 'rubyzip' gem 时,bundle install 问题已经解决。 谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多