以下に掲げるrubyスクリプトのサンプルは、Excel操縦用ライブラリ exlap.rb 最新版: exlap_latest.zipに同梱のものを利用するとの前提で書かれています。
目次
#! ruby -KS # Excelの起動、ワークブックのオープン、空ワークシートの選択、セルへの書込み require "exlap" filename = "test.xls" xl = Exlap.new wb = xl.book_open filename # ワークブックを開く ss = wb.first_empty_sheet # 最初の空シートを選択 # ss.Name = "単純な書き込みのサンプル" # ワークシート名を再設定 ss[1,1] = "経済成長という病" # A1欄への書き込み ss[1,2] = "平川 克美" # B1欄への書き込み wb.save # ファイルの上書き保存 xl.quit # 総てのワークブックを閉じてExcelを終了download sample01.rb
#! ruby -KS
# exlap.rbを用いずにExcelを動かす簡単な例
require "win32ole"
fso = WIN32OLE.new("Scripting.FileSystemObject")
filename = fso.GetAbsolutePathName("test.xls") # フルパス名で記録
xl = WIN32OLE.new("Excel.Application")
xl.Visible = true
if test(?e, filename) # filenameが存在する場合
wb = xl.Workbooks.Open(filename)
else # filenameが存在しないので新規オープン
wb = xl.Workbooks.Add()
end
ss = wb.Worksheets.Item("Sheet2") # Sheet2を処理対象に
ss.Range("A1").Value = "死体の経済学"
ss.Cells.Item(1,2).Value = "窪田 順生"
xl.DisplayAlerts = false # 確認ダイアログを表示しないための表示停止
wb.SaveAs filename, xl.Version.to_f >= 12.0 ? 56 : 43
# ↑ xls形式の保存のため、Excel2003以降なら56, もっと前なら43
xl.Workbooks.Close # ワークブックを閉じる
xl.Quit # Excelの終了
download sample02.rb
#! ruby -KS
# ワークブック中の全ワークシートのデータをタブ区切りテキストで出力
require "exlap"
filename = "book1.xls"
xl = Exlap.new
wb = xl.book_open filename # ワークブックを開く
wb.each {|ss| # ssには各ワークシートオブジェクトがセットされる
print "** #{ss.Name}\n"
ary = ss.to_a
ary.each {|row|
puts row.join("\t").gsub(/\n/, "\\n")
}
print "\n"
}
xl.quit
download sample03.rb
#! ruby -KS
# 複数のワークブックについて全ワークシートのデータをタブ区切りテキストで出力
require "exlap"
Exlap.new("book1.xls", "book2.xls") {|wb|
print "!!#{wb.name}\n" # ワークブックの名前
wb.each {|ss| # ssには各ワークシートオブジェクトがセットされる
print "** #{ss.Name}\n"
ary = ss.to_a
ary.each {|row|
puts row.join("\t").gsub(/\n/, "\\n")
}
print "\n"
}
}
download sample04.rb
#! ruby -KS # 2つのワークブックを開いて、異なるブック間でワークシートをコピー require "exlap" xl = Exlap.new wb1 = xl.book_open "book1.xls" wb2 = xl.book_open "book2.xls" ss1 = wb1.fes ss2 = wb2.fes ss1[1,1] = "経済成長という病" # A1への書き込み ss1[1,2] = "平川 克美" # B1への書き込み addr = ss1.UsedRange.Address # 実際にデータがある領域の番地を得る ss1.Range(addr).Copy(ss2.Range(addr)) # ワークシートss1をss2にコピー wb1.save wb2.save xl.quitdownload sample05.rb
#! ruby -Ks
# 2つのワークブックを同時に開いて処理する例:opens_once利用
require "exlap"
xl = Exlap.new
xl.opens_once("book1.xls", "book2.xls") {|wb1, wb2|
ss1 = wb1.fes
ss2 = wb2.fes
ss1[1,1] = "経済成長という病" # A1への書き込み
ss1[1,2] = "平川 克美" # B1への書き込み
addr = ss1.UsedRange.Address # 実際にデータがある領域の番地を得る
ss1.Range(addr).Copy(ss2.Range(addr)) # ワークシートss1をss2にコピー
wb1.save
wb2.save
}
xl.quit
download sample05b.rb
#! ruby -KS
# 文字の色・大きさ・書体・下線・太さ・斜体の設定
require "exlap"
Exlap.new("test.xls") {|wb|
ss = wb.fes
ss[1,1] = "死体の経済学" # A1への書き込み
ss.cell(1,1).Font.ColorIndex = 5 # 色を青に設定。元は1の黒
ss[1,2] = "窪田 順生" # B1への書き込み
ss.cell(1,2).Font.Size = 20 # 文字サイズを20ポイントの大きさに設定。元は11
ss.Range("C1").Value = "小学館"
ss.Range("C1").Font.Name = "MS 明朝" # 元は "MS Pゴシック"
ss.Range("A2").Value = "円と日本経済の実力"
ss.Range("A2").Font.Underline = XlUnderlineStyleDouble # 二重下線
ss.Range("B2").Value = "鈴木 淑夫"
ss.Range("B2").Font.Bold = true # 太字
ss[3,1] = "This is a pen."
ss.Range("A3").Characters(11,3).Font.Italic = true # penを斜体に
# penは文字列中で 11文字目から3文字分に相当
ss.range_autofit # セル幅を自動調整
wb.save
}
download sample06.rb
#! ruby -KS
# ハイパーリング・罫線
require "exlap"
Exlap.new("test.xls") {|wb|
ss = wb.fes
# ホームページへのハイパーリンクを書き込む
ss.hyperlink(1,1, "http://www.mhlw.go.jp/")
ss.hyperlink(1,2, "http://www.rubylife.jp/ini/index.html", "Ruby入門")
ss.hyperlink("A2", "http://www13.plala.or.jp/mugi_cyan/excel/index.html",
"むぎちゃんのExcelVBA入門")
ss.hyperlink("B2", "http://jp.rubyist.net/magazine/", "Rubyist Magazine")
# A1:B2のセルの幅と高さを自動調節
rng = ss.Range("A1:B2")
ss.range_autofit(rng)
# これまで設けた2×2のセルに罫線を引く。線は総て同じ太さ
ss.range_allbox(rng)
# 次の表のためにデータ書き込み。A4:C5の範囲
ss.Range("A4:C4").Value = "キーワードで読み解く経済", "伊藤 元重",
"NTT出版"
ss.Range("A5:C5").Value = "実録アングラマネー", "有森隆,グループK", "講談社"
# セルの幅と高さを自動調節
rng = ss.Range("A4:C5")
ss.range_autofit(rng)
# 外枠が太く、内側の線は細い罫線で囲む
ss.range_doublebox(rng)
wb.save
}
download sample07.rb
#! ruby -KS
# セルへの関数の書込み(平方根・平均値)
require "exlap"
Exlap.new("test.xls") {|wb|
ss = wb.fes
# 1行に1〜10の数とその平方根を書き込む。
# 最終行には、それら10個の平均値を各々書き込む
max = 10
for y in 1..max
ss[y,1] = y
ss.cell(y,2).Formula = "=SQRT(RC[-1])"
end
ss.cell(11,1).Formula = "=AVERAGE(R[-10]C:R[-1]C)"
ss.cell(11,2).Formula = "=AVERAGE(R[-10]C:R[-1]C)"
wb.save
}
download sample08.rb
#! ruby -KS
# セルの表示形式(NumberFormatLocal)の設定
require "exlap"
Exlap.new("test.xls") {|wb|
ss = wb.fes
# 番号と日付の2欄からなる行を4行作成
# 番号は 001 のように表示、日付は「平成21年1月1日」のように表示
for y in 1..4
ss.cell(y,1).NumberFormatLocal = "000"
ss[y,1] = y
ss.cell(y,2).NumberFormatLocal = "ggge年m月d日"
ss[y,2] = "2009/#{y}/#{y}"
end
ss.range_autofit
wb.save
}
download sample09.rb
#! ruby -KS
# 行の挿入・列の削除・ワークシートのコピー作成・並べ替え
require "exlap"
# 東北6県の人口データを変数に代入
population = [["都道府県", "H17人口", "人口密度", "人口性比"],
["青森", 1437000, 149.5, 89.0],
["岩手", 1385000, 90.7, 91.5],
["宮城", 2360000, 324.0, 94.4],
["秋田", 1146000, 98.6, 88.9],
["山形", 1216000, 130.4, 92.3],
["福島", 2091000, 151.7, 94.4]]
Exlap.new("test.xls") {|wb|
ss = wb.fes
# 東北6県のデータを書き込む
y = 0
population.each {|row|
max = row.size # 1行に含まれるセルの個数
y = y + 1
for x in 1..max
ss[y,x] = row.shift
end
}
ss.findf("青森").EntireRow.Insert # 「青森」がある行のところに1行挿入
# 挿入した1行に北海道のデータを書き込む
y,x = ss.range_address("青森") # 「青森」が書かれたセル番地を得る
y = y - 1 # 1行上をターゲットに
["北海道", 5628000, 71.8, 89.9].each {|val|
ss[y,x] = val
x = x + 1
}
# ワークシートのコピーを作成。同じ内容の新シートがすぐ後ろに挿入される
ss.Copy({'After'=>ss})
ss = wb.offset_sheet(ss, 1) # 次シートに移る
ss.findf("人口性比").EntireColumn.Delete # 「人口性比」の列を削除
rng = ss.UsedRange # データがある領域全体を範囲とする
rng.Sort({'Header'=>XlYes, # 先頭行をタイトル行と見なす
'Key1'=>ss.Range("B2"), # 2列目「H17人口」をキーにする
'Order1'=>XlAscending}) # 小さい順
wb.save
}
download sample10.rb
#! ruby -KS
# 行の折り返し・セル内での中寄せ
require "exlap"
Exlap.new("test.xls") {|wb|
ss = wb.fes
# テスト用のデータ書込み
ss[1,1] = "あかさたなはまやらわ"
ss[1,2] = "あいうえおかきくけこさしすせそたちつてとなにぬねの" +
"はひふへほやゆよらりるれろわをん"
ss[2,1] = "ABC"
ss[2,2] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz"
rng = ss.UsedRange
width = [8, 32] # 各列の幅
rng.Columns.each {|col|
col.ColumnWidth = width.shift # 列の幅を設定
}
rng.Rows.each {|row|
x = 0
row.Columns.each {|col|
x = x + 1
col.WrapText = true # 行の折り返しOn
if x == 1 # 左端のセルを中寄せに設定
col.HorizontalAlignment = XlCenter # 水平方向に中寄せ
col.VerticalAlignment = XlCenter # 垂直方向に中寄せ
end
}
row.AutoFit # セルの高さを自動設定
}
ss.range_allbox(rng)
wb.save
}
download sample11.rb
#! ruby -KS
# ワークシート内に埋込みグラフ作成
require "exlap"
# 東北6県の人口データを変数に代入
population = [["都道府県", "H17人口", "人口密度", "人口性比"],
["青森", 1437000, 149.5, 89.0],
["岩手", 1385000, 90.7, 91.5],
["宮城", 2360000, 324.0, 94.4],
["秋田", 1146000, 98.6, 88.9],
["山形", 1216000, 130.4, 92.3],
["福島", 2091000, 151.7, 94.4]]
Exlap.new("test.xls") {|wb|
ss = wb.fes
y = 0
population.each {|row|
y += 1
for x in 1..row.size
ss[y,x] = row[x-1]
end
}
ss.range_autofit
ss.range_allbox
y,x = ss.range_last
srng = ss.Range(ss.cell(2,1), ss.cell(y,2)) # グラフ化するデータ記録領域
grng = ss.Range(ss.cell(y+4,2), ss.cell(y+14,12)) # グラフを描く領域
chobj = ss.ChartObjects.Add({'Left'=>grng.Left, 'Top'=>grng.Top,
'Width'=>grng.Width, 'Height'=>grng.Height})
chobj.Activate
ch = chobj.Chart
# ch.chartType = XlLine # グラフのタイプ(折れ線)
ch.SetSourceData({'Source'=>srng})
ch.HasTitle = true
ch.ChartTitle.Characters.Text = "東北6県の人口"
ch.Axes(XlCategory, XlPrimary).HasTitle = true # X項目軸
ch.Axes(XlCategory, XlPrimary).AxisTitle.Characters.Text = "都道府県"
ch.Axes(XlValue, XlPrimary).HasTitle = true # Y項目軸
ch.Axes(XlValue, XlPrimary).AxisTitle.Characters.Text = "H17人口"
ch.Deselect # グラフオブジェクトの選択を解除
wb.save
}
download sample12.rb
#! ruby -Ks
# book_opentextメソッドの利用例(タブ区切りテキストの読込み)
require "exlap"
# テスト用データの書き出し
filename = "test_opentext.txt"
File.open(filename, "w") {|fp| fp.print <<EOS
001\tWindows
002\tlinux
003\tFreeBSD
EOS
}
## main
xl = Exlap.new
wb = xl.book_opentext({'Filename'=>filename, 'DataType'=>XlDelimited,
'Tab'=>true, 'TextQualifier'=>XlTextQualifierNone,
'FieldInfo'=>[[1,XlTextFormat]]}) # 第1列を文字型として読み込む
if wb # book_opentextがnilを返すこともあるので注意
ss = wb.ss(1) # 第1ワークシートを選択
ss.range_autofit
wb.save wb.filename.sub(/\.txt$/i, ".xls")
end
xl.quit
download sample13.rb