エクセル⇔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 chrome(Official Build 2200) ではブラウザからコピーすると、途中で変な改行が入ってうまくいかなかった。OperaではOK。