タブ改行テキストを使った、Railsとエクセルとのデータ交換
タブ改行テキストを使った、Railsとエクセルとのデータ交換
(1)エクセルの表をコピーしてエディタにペーストするとタブ改行テキストになる。
(2)Rails(html)のテーブルをコピーしてエディタにペーストするとタブ改行テキストになる。
(3)タブ改行テキストをエクセルにドロップすると、ちゃんと入る。((Railsの表をコピーしてエクセルにペーストすれば、表形式で入る・・ってプログラム(4)以下は必要がない??))
(4)Railsで次のようにタブ改行テキストを作って、send_dataすると、エクセルまたはOOoが自動的に開く。・・拡張子と内容が違うといってくるが、無視すればエクセルが開く。
require "nkf" def dump_kyuuyo_to_excel @kyuuyos = Kyuuyo.find(:all) # ← ここは制限すること。 tab_ret_text = "" tab_ret_text << "\n" tab_ret_text << ["期間","コード","氏名"].collect{|x| NKF.nkf("-Us",x)}.join("\t")+"\n" @kyuuyos.each do |kyuuyo| tab_ret_text << [ kyuuyo.kikan, kyuuyo.code, kyuuyo.simei ].collect{|x| NKF.nkf("-Us",x)}.join("\t")+"\n" end send_data(tab_ret_text, :type => 'application/vnd.ms-excel; charset=iso-8859-1; header=present', :filename => 'report.xls', :disposition => 'attachment') end
(5)一般化すると次のようになる。
require "nkf" def dump_to_excel(data, headers, field_names) tab_ret_text = "" tab_ret_text << "\n" tab_ret_text << headers.collect{|x| NKF.nkf("-Us",x)}.join("\t")+"\n" data.each do |datum| tab_ret_text << field_names.collect{|field_name| NKF.nkf("-Us",datum.send(field_name))}.join("\t")+"\n" end send_data(tab_ret_text, :type => 'application/vnd.ms-excel; charset=iso-8859-1; header=present', :filename => 'report.xls', :disposition => 'attachment') end # # 利用例 # def dump_kyuuyo_to_excel @kyuuyos = Kyuuyo.find(:all) # ← ここは制限すること。 dump_to_excel( @kyuuyos, ["期間","コード","氏名"], [ :kikan, :code, :simei ] ) end
(6)エクセルのデータをRailsに取り込むには、(a)Railsアプリのビューのなかに受け入れようのテキストエリアを作っておき、実行中のブラウザのテキストエリアにドロップしてもらって、データを解析してもよい。しかし、これだと、ユーザがちゃんとした形式や順番で投入するという保障はない。したがって、プログラム側で投入されたデータの色々な可能性に対応しなければならない。また文字コードの変換も必要になる。ちょっとたいへん。(b)マイグレーションファイルにコピーしてしまうのがよい。これなら、プログラマがデータを投入する形になり、形式や順番が一つになるので、簡単になる。さらに、文字コードの変換も、エディタがよきに計らってくれる可能性も高い。
# エクセルからコピーしたタブ改行テキスト @@data = <<MMMM 42 鈴木貫太郎 PCS200407 02-f3-06-ea-0a-40 43 東久邇宮稔彦王 PCS200817 02-f3-06-fa-0a-41 ・・ MMMM def self.up # Machine.create(:name=> "PCS200407", :user_name=>"鈴木貫太郎",:mac_address=>"02-f3-06-ea-0a-40") array = @@data.collect{|line| line.chomp.split("\t")} array.each{|a| Machine.create(:name=> a[2], :user_name=>a[1],:mac_address_d=>a[3]) } end def self.down # Machine.find_by_name("PCS200407").destroy array = @@data.collect{|line| line.chomp.split("\t")} array.each{|a| Machine.find_by_name(a[2]).destroy } end
* なぜか。。このWebページのコードをNetBeansにコピペすると「\」文字がエスケープ文字として認識されなくなるようです。(見た目は同じだが、たぶん、文字コードが異なる)。その場合には、「\」文字を書き直せば、大丈夫です。
【サンプルデータ】・・これをエディタにコピペすればタブ改行テキストになるはず。
社員番号 | 氏名 | PC名 | MACアドレス |
---|---|---|---|
42 | 鈴木貫太郎 | PCS200407 | 02-f3-06-ea-0a-40 |
43 | 東久邇宮稔彦王 | PCS200817 | 02-f3-06-fa-0a-41 |
44 | 幣原喜重郎 | PCS201009 | 12-e3-16-ea-0a-42 |
45 | 吉田 茂 | PCS210522 | 12-e3-16-ea-0a-43 |
46 | 片山 哲 | PCS220524 | 22-d3-26-da-0a-44 |
47 | 芦田 均 | PCS230310 | 22-d3-26-da-0a-45 |
48 | 吉田 茂 | PCS231015 | 32-c3-36-ca-0a-46 |
52 | 鳩山一郎 | PCS291210 | 32-c3-36-ca-0a-47 |
55 | 石橋湛山 | PCS311223 | 42-b3-46-ba-0a-48 |
56 | 岸 信介 | PCS320225 | 42-b3-46-ba-0a-49 |
58 | 池田勇人 | PCS350719 | 52-a3-56-aa-0a-4a |
61 | 佐藤榮作 | PCS391109 | 52-a3-56-aa-0a-4b |
64 | 田中角榮 | PCS470707 | 62-93-66-9a-0a-4c |
66 | 三木武夫 | PCS491209 | 62-93-66-9a-0a-4d |
67 | 福田赳夫 | PCS511224 | 72-83-76-8a-0a-4e |
68 | 大平正芳 | PCS531207 | 72-83-76-8a-0a-4f |
69 | 伊東正義 | PCS550612 | 82-73-86-7a-0a-00 |
70 | 鈴木善幸 | PCS550717 | 82-73-86-7a-0a-10 |
71 | 中曽根康弘 | PCS571127 | 92-63-96-6a-0a-20 |
74 | 竹下 登 | PCS621106 | 92-63-96-6a-0a-30 |
75 | 宇野宗佑 | PCH010603 | a2-53-a6-5a-0a-40 |
76 | 海部俊樹 | PCH010810 | a2-53-a6-5a-0a-50 |
78 | 宮澤喜一 | PCH031105 | b2-43-b6-4a-0a-60 |
79 | 細川護煕 | PCH050809 | b2-43-b6-4a-0a-70 |
80 | 羽田 孜 | PCH060428 | c2-33-c6-3a-0a-80 |
81 | 村山富市 | PCH060630 | c2-33-c6-3a-0a-90 |
82 | 橋本龍太郎 | PCH080111 | d2-23-d6-2a-0a-a0 |
84 | 小渕恵三 | PCH100730 | d2-23-d6-2a-0a-b0 |
85 | 森 喜朗 | PCH120405 | e2-13-e6-1a-0a-c0 |
87 | 小泉純一郎 | PCH130426 | e2-13-e6-1a-0a-d0 |
90 | 安倍晋三 | PCH180926 | f2-03-f6-0a-0a-e0 |
91 | 福田康夫 | PCH190926 | f2-03-f6-0a-0a-40 |