2011年07月01日

Ruby on Rails 〜Excelの読み込み spreadsheet〜

spreadsheetとは?


rubyでExcelファイルを読み込むためのライブラリです。

環境


ruby 1.9.1p378
rails 2.3.11
rake 0.8.7
spreadsheet
Excel

使用した背景


Excelにフィールドの仕様を書いてあるのですが、それを元に取り込み用のファイルを作成するのが面倒だったために、Excelから直接ファイルが作成したくて作成しました。

Install


$ gem install spreadsheet


rakeで実行するためlib/tasksに作成


$ vi lib/tasks/hoge.rake
require 'rake'
require 'spreadsheet' // これでspreadsheetを読み込む
namespace :excel_conversion do
task :create_field_csv do end
end


取込み先と出力先を指定させるために引数を追加


task :create_field_csv, "in_file", "out_file"
task :create_field_csv do |x, args|


Excelを読み込む


excel = Spreadsheet.open(args.file, 'rb')


sheetの選択


sheet = excel.worksheet("シート名")


指定行の読み込み


row = sheet.row(r)
※ r=整数


指定行で指定行の読み込み


row[l]
※ l=整数


実際のソース


require 'rake'
require 'spreadsheet'
require 'csv'
require 'app/models/field'
namespace :excel_conversion do
task :create_field_csv, "in_file", "out_file" # 引数を受け取るために記述
task :create_field_csv do |x, args|
excel = Spreadsheet.open(args.in_file, 'rb') # 読み込み専用
sheet = excel.worksheet("シート名")
r = 4 # 行
l = 1 # 列

text = CSV.generate do |csv|
while r <= 50 do # 適当に50行読み込む
row = sheet.row(r)
rows = []
break if row[1].blank? # 50行全部読み込むと長いので空の行があったら停止
while l <= 9 do # 指定列の9行目までを読み込む
case l
when 3
Field::TYPES.each do |f| # app/models/fieldを読み込んでFieldモデルのTYPESを読み込んでいます。
if f.name == row[l]
rows << LABEL[f.code] # ただのhashで入れる値を変えてるだけです。
end
end
when 4
# 3列と4列は結合しているため4列目は登録しない
when 5,6,7,8,9
row[l].blank? ? rows << 0 : rows << 1
else
rows << row[l]
end
l += 1
end
csv << rows
l = 1
r += 1
end
end
# ファイル出力
file = open(args.out_file, 'w')
file.puts text
file.close
end
end


実行方法


$ rake excel_conversion:create_field_csv[参照先,出力先]
posted by RicK at 18:08| Comment(0) | TrackBack(0) | 日記