Excel导出不起作用

我在我的应用程序中添加了一个CSV和Excel导出function,但下载文件后,它只显示这个#<Axlsx::Worksheet:0x007f5d23708dc0>而不是电子表格中所需的数据。

我也分享我用过的方法和gem。

对于这个导出,我在Module Export下创build了一个单独的控制器和一个单独的类

 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 !@trackers @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 –

 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 

export_xls正在返回一个ruby对象,你需要返回文件stream本身。

 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