Ruby on rails 下载由XlsxWriter在rails中创建的XLSX文件

Ruby on rails 下载由XlsxWriter在rails中创建的XLSX文件,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试将xlsx文件保存到浏览器下载,单击浏览器按钮时会激活以下功能 def trip_bit @car = Car.find(params[:id]) @t = @car.trips.all @trips = @t.order(:started_at) if @trips then doc = XlsxWriter.new doc.quiet_booleans! sheet = doc.add_sheet("Vitácora de Viajes "+@car.model+'

我正在尝试将xlsx文件保存到浏览器下载,单击浏览器按钮时会激活以下功能

def trip_bit
@car = Car.find(params[:id])
@t = @car.trips.all
@trips = @t.order(:started_at)

if @trips then
  doc = XlsxWriter.new
  doc.quiet_booleans!
  sheet = doc.add_sheet("Vitácora de Viajes "+@car.model+' '+@car.year.to_s)
  sheet.freeze_top_left = 'A2'
  sheet.add_row(['Salida', 'Llegada', 'Origen', 'Destino', 'Distancia', 'Duración', 'Score'])
  @trips.each do |trip|
    sheet.add_row([trip.started_at.to_s, trip.finished_at.to_s, if trip.origin then trip.origin.address end, if trip.destination then trip.destination.address end, trip.distance.to_s+'km', trip.duration.to_s+'min', trip.grade])
  end
  sheet.add_row(["","","","Total", @trips.map { |trip| trip.distance }.sum.to_s+"km", @trips.map { |trip| trip.duration}.sum.to_s+"min", ""])
else
  redirect_to my_car_details_path
  flash.now[:alert] = 'Este coche no tiene viajes registrados'
end

send_file doc, :filename => "bitacora.xlsx"

end

xlsx文件
doc
已创建并保存到本地文件系统,但我找不到将其发送到浏览器下载的方法。

查看
send\u file
和XlsxWriter的文档后,错误告诉您它需要字符串,但您正在向它传递XlsxWriter类型的对象。您可以尝试使用
path
方法告诉
sendfile
文件在哪里

send_file(doc.path, :disposition => 'attachment', :filename => "bitacora.xlsx", type: "application/xml")
您没有指出rails应用程序的任何结构,因此我假设这是一个控制器方法。您可能会按照以下思路做一些事情:

def trip_bit
@car = Car.find(params[:id])
@t = @car.trips.all
@trips = @t.order(:started_at)

if @trips then
  doc = XlsxWriter.new
  doc.quiet_booleans!
  sheet = doc.add_sheet("Vitácora de Viajes "+@car.model+' '+@car.year.to_s)
  sheet.freeze_top_left = 'A2'
  sheet.add_row(['Salida', 'Llegada', 'Origen', 'Destino', 'Distancia', 'Duración', 'Score'])
  @trips.each do |trip|
    sheet.add_row([trip.started_at.to_s, trip.finished_at.to_s, if trip.origin then trip.origin.address end, if trip.destination then trip.destination.address end, trip.distance.to_s+'km', trip.duration.to_s+'min', trip.grade])
  end
  sheet.add_row(["","","","Total", @trips.map { |trip| trip.distance }.sum.to_s+"km", @trips.map { |trip| trip.duration}.sum.to_s+"min", ""])
else
  redirect_to my_car_details_path
  flash.now[:alert] = 'Este coche no tiene viajes registrados'
end

respond_to do |format|
    format.xlsx
  end

end
上面的代码是一个直截了当的猜测,因为XlsxWriter是一个C库的绑定,从Rails的角度来看,文档非常薄,对我来说几乎毫无用处。我一直在使用axlsx_rails gem。它允许您定义一个模板,并将该模板交给Rails数据结构。我强烈建议您在以下网址查看:

它允许您以一种类似Rails的方式继续工作。当我想将用户电子表格导出到xlsx时,我只需在控制器中执行以下操作:

  def index
    @users = User.active
    respond_to do |format|
      format.html
      format.xlsx
    end
  end
然后在我的视图中,我的
index.html.erb
旁边有一个名为
index.xlsx.axlsx
的文件,它看起来像:

wb = xlsx_package.workbook
wb.add_worksheet(name: "Users") do |sheet|
sheet.add_row ['User', 'User Access Role']
  @users.each do |user|
    sheet.add_row [user.email, user.role.name]
  end
end

正如您所见,您在模板中有创建电子表格的逻辑。你做这件事的方式非常简陋和混乱

你的意思是,如果有人点击该文件,该文件会被保存,但不会保存在计算机的“下载”文件夹中吗?或者它没有显示在浏览器菜单下拉列表中的下载列表中?你用什么浏览器测试过?你的意思是:我用过Chrome和Safari,我想说的是xlsx文件存在,但我不知道如何将它发送到浏览器下载。使用send_文件,我会看到一个红色屏幕,上面显示没有将XlsxWriter隐式转换为String@Beartech我认为send_文件不适用于xlsx Writers,直到不清楚您的意思:“我想说的是xlsx文件存在,但我不知道如何将其发送到浏览器下载”.谢谢,我现在正在使用axlsx gem,它工作得非常完美!