Ruby on rails 下载由XlsxWriter在rails中创建的XLSX文件
我正在尝试将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+'
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,它工作得非常完美!