rubyのCGIでexcelファイルをダウンロードさせるようにする方法です。
Spreadsheet::Workbook#write() の引数に STDOUT を指定するとエラーになるので、Tempfile に書き出しておいて rewind してから read して出力しています。
普通のファイルに書き込むと、エラー処理などが面倒ですが、Tempfile ならファイルが残らないので便利です。
#!/usr/local/bin/ruby
KCODE = 'u'
require 'jcode'
require 'cgi'
require 'tempfile'
require 'rubygems'
require 'spreadsheet'
# シートを作成
book = Spreadsheet::Workbook.new
sheet = book.create_worksheet
sheet[0, 0] = 'テスト1'
sheet[0, 1] = 'テスト2'
# シートを出力
Tempfile.open('/tmp') do |tf|
book.write(tf)
tf.rewind
# ダウンロードファイル名
file_name = "download.xls"
print("Content-Type: application/octet-stream\n")
print("Pragma: private\n")
print("Content-Disposition: attachment; filename=\"#{file_name}\"\n")
print("\n")
print(tf.read)
end
Spreadsheet::Workbook#write() の引数に STDOUT を指定するとエラーになるので、Tempfile に書き出しておいて rewind してから read して出力しています。
普通のファイルに書き込むと、エラー処理などが面倒ですが、Tempfile ならファイルが残らないので便利です。
#!/usr/local/bin/ruby
KCODE = 'u'
require 'jcode'
require 'cgi'
require 'tempfile'
require 'rubygems'
require 'spreadsheet'
# シートを作成
book = Spreadsheet::Workbook.new
sheet = book.create_worksheet
sheet[0, 0] = 'テスト1'
sheet[0, 1] = 'テスト2'
# シートを出力
Tempfile.open('/tmp') do |tf|
book.write(tf)
tf.rewind
# ダウンロードファイル名
file_name = "download.xls"
print("Content-Type: application/octet-stream\n")
print("Pragma: private\n")
print("Content-Disposition: attachment; filename=\"#{file_name}\"\n")
print("\n")
print(tf.read)
end