Сложность с send_data в Ruby on Rails в сочетании с плагином Spreadsheet - PullRequest
7 голосов
/ 19 октября 2010

У меня есть функция в контроллере, которая принимает некоторые спецификации и генерирует отчет по ним. Эта функция user_report вызывается в представлении:

<% = submit_to_remote «кнопка отправки», «Экспорт отчета в Excel»,: url => {: controller =>: отчеты,: действие =>: user_report,: print_state => 'print'}%>

В reports_controller я использую плагин Spreadsheet для генерации файла Excel в функции user_report. Я хочу использовать send_data для потоковой передачи файла пользователю без предварительного его создания на сервере. Исследование, которое я провел, показывает, что использование StringIO - это путь, как показано ниже. К сожалению, ничего не происходит, когда я вызываю send_data. Плагин, кажется, хорошо работает, создавая файл и сохраняя его на сервере, но ничего не делает, когда я использую send_file, предполагая, что проблема не в плагине. Но тогда что я делаю не так с send_file / send_data?

Сама функция выглядит так:

def user_report

if request.post?
  unless params[:reports][:userid].blank?
    @userid=params[:reports][:userid]
  end
  if params[:print_state]=='print'  

    report = Spreadsheet::Workbook.new
    info = report.create_worksheet :name => 'User Information'
    info.row(1).push 'User ID', @userid

    @outfile = "Report_for_#{@userid}.xls"

    require 'stringio'
    data = StringIO.new ''
    report.write data
    send_data data.string, :type=>"application/excel", :disposition=>'attachment', :filename => @outfile
  end

  respond_to do |format|
    format.js { }
  end
end

конец

Файл журнала читает 2010-10-18 14:13:59 INFO - Отправка данных Report_for_jjohnson.xls но загрузка не начинается в браузере. Мне уже удалось использовать send_data в этом приложении, что сбивает с толку.

Я использую Rails v2.3, Ruby v1.8.7 и Spreadsheet v6.4.1 на spreadsheet.rubyforge.org.

Ответы [ 2 ]

6 голосов
/ 23 октября 2010

Просто измените строку:

send_data data.string, :type=>"application/excel", :disposition=>'attachment', :filename => @outfile

на:

send_data data.string.bytes.to_a.pack("C*"), :type=>"application/excel", :disposition=>'attachment', :filename => @outfile
0 голосов
/ 06 сентября 2013

Хотя я не люблю писать и удалять, но с электронной таблицей кажется единственным выходом.


  # write the file

 book.write "Employee_History_#{ params[:id]}.xls"

 # send the file

 send_file "Employee_History_#{ params[:id]}.xls", :type => "application/vnd.ms-excel", :filename => "data.xls", :stream => false

 # and then delete the file

 File.delete("Employee_History_#{ params[:id]}.xls")
...