2016-08-16 8 views
0

내 앱에 CSV 및 Excel 내보내기 기능이 추가되었지만 파일을 다운로드 한 후 스프레드 시트에 필요한 데이터 대신 #<Axlsx::Worksheet:0x007f5d23708dc0>이 표시됩니다.Excel 내보내기가 작동하지 않습니다.

나는 또한 내가 사용한 방법과 보석을 공유하고 있습니다.

이 수출

, 나는 모듈 수출에서 별도의 컨트롤러와 별도의 클래스를 만들었습니다 설치되어

require 'csv' 
require 'axlsx' 
# extend ActiveSupport::Concern 
# include Rails.application.routes.url_helpers 
module Export 
    class ParseError < ::StandardError; end 
    class ExportError < ::StandardError; end 
    class TimesheetExport 
    attr_accessor :error 

    def initialize(trackers, export_to='csv') 
     @trackers = trackers 
     @export_to = export_to 
    rescue ActiveRecord::RecordNotFound 
    end 

    def process 
     if [email protected] 
     @error = "Not Found" 
     return false 
     else 
     case @export_to 
      when "csv" 
      export_csv 
      when "xls" 
      export_xls 
      else 
      raise ExportError 
     end 
     end 
    end 

    def export_csv 
     columns = %w(Date Task Task_URL TimeSpent Log) 
     CSV.generate do |csv| 
     csv << columns 
     @trackers.each do |t| 
      csv << [t.created_at.to_s(:short_human_with_12hours), 
        t.task.name, 
        #project_task_url(t.task.project, t.task, host: AppConfig.app_url), 
        t.time_spent, 
        t.description ] 
     end 
     end 
    end 

    def export_xls 
     package = Axlsx::Package.new 
     workbook = package.workbook 
     workbook.add_worksheet(name: "Timesheet") do |sheet| 
     sheet.add_row ["Date", "Task Name","Time Spent","Log"] 
      @trackers.each do |t| 
      sheet.add_row [t.created_at.to_s(:short_human_with_12hours), 
          t.task.name, 
          t.time_spent, 
          t.description] 
     end 
     end 
    end 

보석 -

gem 'axlsx', '= 2.0.1' 
gem 'axlsx_rails' 

을 그리고 이것은 내가 전달 해요 방법입니다 내보내기 컨트롤러의 값 -

@exporter = Export::TimesheetExport.new(user_trackers, params[:export_to]) 
    export_string = @exporter.process 
    if export_string 
     case params[:export_to] 
     when "csv" 
      send_data export_string, 
        type: 'text/csv; charset=iso-8859-1; header=present', 
        disposition: "attachment; filename=#{@exporter.file_name}" 
     when "xls" 
      send_data export_string, 
        type: 'application/xls; charset=iso-8859-1; header=present', 
        disposition: "attachment; filename=#{@exporter.file_name}" 
     end 
    else 
     flash[:alert] = @exporter.error 
     redirect_to timesheet_path 

답변

2

export_xls가 루비 객체를 반환하면 파일 스트림 자체를 반환해야합니다.

def export_xls 
     package = Axlsx::Package.new 
     workbook = package.workbook 
     workbook.add_worksheet(name: "Timesheet") do |sheet| 
     sheet.add_row ["Date", "Task Name","Time Spent","Log"] 
      @trackers.each do |t| 
      sheet.add_row [t.created_at.to_s(:short_human_with_12hours), 
          t.task.name, 
          t.time_spent, 
          t.description] 
     end 
     end 
     package.to_stream.read # Return the file stream to send_data 
    end 
관련 문제