エクセル⇔Rails

エクセル⇔Rails

コピー&ペーストを使った安易な方法・・

「@upload=Struct.new(:input,:log,:ommit).new(input,log,ommit)」というようにすると、「<% form_for :upload do |f| %>」「<%= f.text_area :input %>」に必要なデータが簡単に作れるようです。


<h1> 投票人のデータのアップロード </h1>

エクセル(OpenOfficeでも可。または他の総会の「投票人リスト」)からのアップロードを行います。<br />
<br />
エクセルでの形式は、最低限「氏名」もしくは「投票人氏名」もしくは「投票人名」という桁を含んが行(タイトル行)がなければなりません。<br />
タイトル行より下の行が取り込みの対象となります。<br />
タイトル行に「読み」、「分類」、「物件」もしくは「部屋番号」、「議決権」もしくは「議決権数」、「同居代理人」、「物件リスト」、「メモ」という名前の桁があれば取り込みます。<br />
それ以外の項目は無視されます。<br />
<br />
* エクセルに雛形を作るには・・「<%= link_to("投票人リスト", touhyounins_path)%>」で何人かのデータを作ってから、全てを選択(Ctrl+A)、コピー(Ctrl+C)でクリップボードに取り込んでエクセルに Ctrl+V で放り込めばエクセルに雛形ができます。<br />
<br />
エクセルで、そのような形式のデータを表示して(または他の総会の「投票人リスト」を表示して)、全て(Ctrl+A)または必要な部分を選択して、コピー(Ctrl+C)してクリップボードに取り込み、下記の【投入窓】に放り込んでください(Ctrl+V)。<br />
その後に、「取り込み」ボタンを押してください。<br />
<br />
* ブラウザによっては、「投票人リスト」から「投票人リスト」への直接のコピーではうまくいかないものがあるようです。その場合にはエクセルを経由してコピーしてください<br />

<% form_for :upload do |f| %>
  <br />【投入窓】<br />
  <%= f.text_area :input, :size=>"80x5" %>
  <%= f.submit "取り込み" %>
  <br />【結果窓】<br />
  <%= f.text_area :log , :size=>"80x5", :readonly=>true %>
<% end %>
    #
    # upload アクション
    #
  UPLOAD_HISSU = {
      "氏名"=>:name,"投票人氏名"=>:name,"投票人名"=>:name,
  }
  UPLOAD_ACCEPTABLE = {
      "氏名"=>:name,"投票人氏名"=>:name,"投票人名"=>:name,
      "読み"=>:yomi,
      "物件"=>:bukken,"部屋番号"=>:bukken, "番号"=>:bukken,
      "分類"=>:bukken_bunrui, "物件分類"=>:bukken_bunrui, ""=>:bukken_bunrui,
      "議決権"=>:giketuken,"議決権数"=>:giketuken,
      "同居代理人"=>:doukyo_dairinin,
      "物件リスト"=>:bukken_list,
      "メモ"=>:memo,
    }.merge(UPLOAD_HISSU)
  def upload
    input = ((upload=params["upload"]) && upload["input"] ) || ""
    log   = "(「取り込み」ボタンを押すと、結果が表示されます)"
    ommit = "(取り込まれなかった行と桁が表示されます)"
    @upload=Struct.new(:input,:log,:ommit).new(input,log,ommit)
    return if input.empty?
      #
      #「氏名」もしくは「投票人氏名」もしくは「投票人名」という桁を含んでいなければなりません。
      # その他に「読み」、「分類」、「物件」もしくは「部屋番号」、
      #「議決権」もしくは「議決権数」、「同居代理人」、「物件リスト」、「メモ」という名前の桁があれば取り込みます。
      #
    hissu = UPLOAD_HISSU
    acceptables = UPLOAD_ACCEPTABLE
    ketas = {}
    log = []
    input.each_line{|line|
      cols = line.split("\t")
      if ketas.empty?
        unless cols.find{|col| hissu.include? col}
          log << "無視:"+line
          next
        end
        ommit = []
        cols.each_with_index{| col, index|
          unless (koumoku = acceptables[col])
            ommit << col
            next
          end
          ketas[index]=koumoku
        }
        log << "項目名を取り込みました(#{ketas.values.inspect}):" + line
        next
      end
      if cols.find{|col| hissu.include? col}
        log << "無視(たぶん項目行):"+line
        next
      end
      v = {}
      cols.each_with_index{| col, index|
        next unless (koumoku = ketas[index])
        v[koumoku] = col
      }
      if v.size != ketas.size
        log << "無視(データ数が足りません)(#{[:v,v.size,:ketas,ketas.size,:cols,cols.size,ketas,v].inspect}):"+line
        next
      end
      if v[:name].empty?
        log << "無視(名前が空です)(#{[:v,v.size,:ketas,ketas.size,:cols,cols.size,ketas,v].inspect}):"+line
        next
      end
      begin
        v[:soukai_id] = session.soukai_id
        Touhyounin.create(v)
      rescue
        log << "取り込みに失敗しました(#{$!.message})"+line
        next
      end
      log << "取り込みました(#{[v].inspect})"+line
    }
    @upload=Struct.new(:input,:log,:ommit).new(input,log,ommit)
  end

* google chromeOfficial Build 2200) ではブラウザからコピーすると、途中で変な改行が入ってうまくいかなかった。OperaではOK。