以下に掲げる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.quitdownload 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.quitdownload 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.quitdownload sample13.rb