■コントローラ require 'csv' ・・・ def export period_from = mkdate_from_hash(params[:period_from]) period_to = mkdate_from_hash(params[:period_to]) + 1.day if (period_to - 1.day) < (period_from) render_with_flash("csv","終了日が開始日より前です") return end buf = "" @students = Student.find(:all, :conditions => ["? <= held_date_time and held_date_time < ?",period_from,period_to], :include => "interview", :order => "held_date_time DESC") if @students.size == 0 render_with_flash("csv","指定した期間内の面接に予約している学生はいませんでした") return else @students.each{|student| CSV.generate_row(student.to_export_format,Student::CSV_COL_SIZE,buf) } buf=Student::CSV_HEADER+buf send_data buf, :type => 'text/csv; charset=shift_jis', :filename => "students_"+period_from.strftime("%y%m%d")+"_"+period_to.strftime("%y%m%d")+".csv" end end
■モデル CSV_COL_SIZE = 17 CSV_HEADER = "参加日,面接ステータス,学生ステータス,氏,名,カナ(氏),カナ(名), 性別,メールアドレス,携帯番号,誕生日,区分,専攻,学年,学校,学部・学科,経路 ".tosjis+"\n\n" def to_export_format [ " "+self.interview.held_date_time.strftime("%Y/%m/%d"), self.interview_type.name.tosjis, self.student_status.name.tosjis, self.family_name.tosjis, self.first_name.tosjis, self.family_name_kana.tosjis, self.first_name_kana.tosjis, self.sex.tosjis, self.mail_address, to_mobile_format(self.mobile_phone_no), " "+self.birthday.strftime("%Y/%m/%d"), self.segment.tosjis, self.major.tosjis, self.grade, self.school.tosjis, self.department.tosjis, self.apply_channel.tosjis ] end
■ビュー <% @title="CSVダウンロード" -%> 指定した期間の面接に予約をしているか、参加して、かつ未評価の学生のデータをダウンロードします<br><br> <% form_tag :action => "export" do -%> <p> <%= select_date Date.today,:prefix=>"period_from",:use_month_numbers => true %> 〜 <%= select_date Date.today,:prefix=>"period_to",:use_month_numbers => true %> </p> <%= submit_tag("ダウンロード") %> <% end -%> <br> <%= link_to "戻る",:action => "list" %>