Minamirb + axlsx : 秘密のカンニング資料


まあ、終わったらどうやってやるんやったっけ?と迷うこともあると思って、ここにライブプログラミングで実施する内容をまとめます。別に日本語は母国語ではないので、多少(かなり?!!?)間違いの多い、変な日本語許してね -randym



このrepoに必要なgemなどは既に含まれています。通常の場合は

gem "acts_as_xlsx"
または
gem "axlsx_rails"
をGemfileに追加するのはわかっていますよね。


じゃ、はじめようか

  • acts_as_xlsxlを使ってみよう

    メリット
    説明しやすい!すべてのコードがコントローラーやモデルに含まれているのでわかりやすい。
    デメリット
    多くのRailsプログラマーはコントローラーをごちゃごちゃしたくないですね。
    プチアドバイス

    まぁ、ActionController::RenderersやActionController::ResponderやActionView::Template::Handlersを聞くと「えっ?なにそれ?」と感じたらacts_as_xlsxを使いましょう。

    1

    モデルにacts_as_xlsxを追加する
    # models/post.rb
    class Post < ActiveRecord::Base

       acts_as_xlsx


    宿題 !!

    Commentのモデルに同じくacts_as_xlsxを追加したまえ!

    2

    コントローラーにrespond_toを加入する
    # app/controllers/posts_controller.rb
    def index

    @posts = Post.all

    respond_to do | format | 
      format.html # index.html.erb
      format.json { render :json => @posts }
      format.xlsx {
          send_data Post.to_xlsx.to_stream.read, :filename => "posts.xlsx", :type => "application/vnd.openxmlformates-officedocument.spreadsheetml.sheet"
     }  
      end
    end

    宿題 !!

    この段階で既に自動生成されたPostのxlsxファイルはダウロードできます。どのURLかわかりますか?それをアクセスしてみたまえ!

    3

    DLリンクがないとわからない
    # app/views/posts/index.html.erb
    <%= link_to current_url(format: :xlsx), class: "btn" do %>
      <i class="icon icon-download"> xlsx </i>
    <% end %>
    運が良ければ、以下のようなものがDLされます
    Step_3_axlsx

    4

    つまらないものを面白くする
    # models/post.rb
    class Post < ActiveRecord::Base

      acts_as_xlsx :columns => [:name, title, :content, :created_at, :'comments.size'], :i18n => :xlsx_reports


    宿題 !!

    comments.sizeってなに?なぜそれは動くのか答えたまえ

    5

    お客さんはフィールド名に関しては興味ないで〜。だからi18nを使うねん
    ja:
      xlsx_reports:
        posts: 投稿内容
        post:
          name: 投稿者
          title: 件名
          content: ポスト内容
          comments:
            size: コメント数
    
    宿題 !!

    上記の4で:i18n => :xlsx_reportsに設定したが、それは何を指示しているかをわかった上、証拠を出したまえ!
    hint: bundle open acts_as_xlsx

    6

    イケメンレポートの必殺技

    posts_contoller.rbを以下のようにいじりましょう

         format.xlsx { send_data Post.xlsx_report,
                        filename: 'posts.xlsx',
                        type: "application/vnd.openxmlformates-officedocument.spreadsheetml.sheet" }
        

    そして、Postのモデルにxlsx_reportを定義しましょう<ごめん、いちいち色を付けるのはめんどくさい!!>

      def self.xlsx_report
        # require "axlsx"
        package = Post.to_xlsx
        chart_color =  %w(88F700, 279CAC, B2A200, FD66A3, F20062, C8BA2B, 67E6F8, DFFDB9, FFE800, B6F0F8)
        header_style = { :bg_color => "00", :fg_color => "FF", :alignment => { :horizontal => :center }, :bold => true }
        header_xf = package.workbook.styles.add_style header_style
        package.workbook.worksheets.first.tap do |sheet|
          sheet.row_style 0, header_xf
          sheet.add_chart(Axlsx::Pie3DChart, :title => "コメント獲得") do |chart|
            chart.add_series :data => sheet.cols[3][(1..-1)], :labels => sheet.cols[0][(1..-1)], :colors => chart_color
            chart.start_at 2, sheet.rows.size
            chart.end_at 3, sheet.rows.size + 20 
          end
        end
        package.to_stream.read
      end
    
        

    また、運次第だが、以下のようなものが出てきたらラッキー!

    Final_acts_as_xlsx



  • axlsx_railsの場合

    メリット
    カスタムレンダラーを使っているので、レポート作成するコードをビューとしてあつかえられる。
    デメリット
    Railsの中級や上級者じゃない限り、まるで魔法みたい。randymのこだわり:わからんコード使うなよ!作るものをメンテナンスするのはあなただから
    プチアドバイス

    アクセス数はそんなにないならば私はこのスタイルを好む。忙しいサイトならsend_dataより、バックグラウンドで生成し、別のウェブサーバから提供した方がいろいろ無難(だからわからんコードを使うなってば)