タブ改行テキストを使った、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