2011年08月08日

rubyつかってExcel編集

ひさしぶりにrubyでプログラムを書きました.
本格的に(?),ExcelファイルをRubyプログラムで修正したのは初めてかもしれない.(いつもVBでガリガリやってた.)



Excelで,大項目・中項目・小項目と3つの要素をもつ列があって,それぞれに数字を割り当てたいと思ったのだけど,あまりにも項目数が多くて,マウスで連番を振っていってもミスが出そう,

そのミスがないかを確認するのも面倒でかったるいということでプログラムを書きました.

たぶん,マウスでセコセコ頑張ったほうが,早く終わったと思うけど,Excelをruby で編集する作業をしてみたかったのと,今後同じようなシチュエーションで応用が効くと思ったので,プログラミングの時間をとりました.

やってみると,VBAで書くより,Rubyで書くほうがすんなりかけるなという印象.
Excelの中身は例にするとこんな感じ.


|大項目| 中項目| 小項目|
|肉 | 豚| ランプ|
|肉 | 豚| もも|
|肉 | 豚| ロース|
|肉 | 牛| タン|
|肉 | 牛| カルビ|
|肉 | 牛| すね|
|肉 | 牛| ロース|
|肉 | 鳥| ハツ|
|肉 | 鳥| レバー|
|やさい| 人参| ...|
|.. | ... | ...|


とか.これに新規に列を入れて,番号を以下のように振っていきたい.



| |大項目| | 中項目| | 小項目|
|1|肉 |1| 豚|1| ランプ|
|1|肉 |1| 豚|2| もも|
|1|肉 |1| 豚|3| ロース|
|1|肉 |2| 牛|1| タン|
|1|肉 |2| 牛|2| カルビ|
|1|肉 |2| 牛|3| すね|
|1|肉 |2| 牛|4| ロース|
|1|肉 |3| 鳥|1| ハツ|
|1|肉 |3| 鳥|2| レバー|
|2|やさい|1| 人参|1| ...|
|2|.. |.| ... |.| ...|




できたプログラムはこんな感じ.もう少しシンプルに書きたいけど,すんなり動いたからよしとしよう.



#!/usr/local/bin/ruby -Ks
# -*- coding: utf-8 -*-

require 'win32ole'
#require 'spreadsheet'

app = WIN32OLE.new('Excel.Application')
book = app.Workbooks.Open(app.GetOpenFilename)

sheet = book.worksheets.item(1)
column = sheet.columns(3)

i = 2
pre1 = pre2 = pre3 = cur1 = cur2 = cur3 = ""
cnt1 = cnt2 = cnt3 = 0

match = lambda do |x, y, c, d, cnt|
if x == y then
if c != d then
val = (cnt.to_i + 1.to_i)
else
val = cnt
end
else
# parent is different.
val = 1.to_i
end
return val
end

#取り出した行から、セルを一つづつ取り出す
while ( (cell = column.rows(i)).Value )
p cell.Address
p cell.Value
pre1 = cur1
pre2 = cur2
pre3 = cur3
cur1 = cell.Value
cur2 = sheet.columns(5).rows(i).Value
cur3 = sheet.columns(7).rows(i).Value

cnt1 = match.call(0, 0, pre1, cur1, cnt1)
cnt2 = match.call(pre1, cur1, pre2, cur2, cnt2)
cnt3 = match.call(pre2, cur2, pre3, cur3, cnt3)

# if a cell is null, number should be empty.
if cur2 == nil then
cnt2 = nil
end
if cur3 == nil then
cnt3 = nil
end

sheet.columns(2).rows(i).Value = cnt1
sheet.columns(4).rows(i).Value = cnt2
sheet.columns(6).rows(i).Value = cnt3
i += 1
end

book.save
book.close(false)
app.quit

posted by maplewine at 21:09| Comment(0) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック