基本的なサンプル

以下に掲げるrubyスクリプトのサンプルは、Excel操縦用ライブラリ exlap.rb 最新版: exlap_latest.zipに同梱のものを利用するとの前提で書かれています。

目次

sample01.rb
Excelの起動、ワークブックのオープン、空ワークシートの選択、セルへの書込み
sample02.rb
exlap.rbを用いずにExcelを動かす簡単な例
sample03.rb
ワークブック中の全ワークシートのデータをタブ区切りテキストで出力
sample04.rb
複数のワークブックについて全ワークシートのデータをタブ区切りテキストで出力
sample05.rb
2つのワークブックを開いて、異なるブック間でワークシートをコピー
sample05b.rb
2つのワークブックを同時に開いて処理する例:opens_once利用
sample06.rb
文字の色・大きさ・書体・下線・太さ・斜体の設定
sample07.rb
ハイパーリング・罫線
sample08.rb
セルへの関数の書込み(平方根・平均値)
sample09.rb
セルの表示形式(NumberFormatLocal)の設定
sample10.rb
行の挿入・列の削除・ワークシートのコピー作成・並べ替え
sample11.rb
行の折り返し・セル内での中寄せ
sample12.rb
ワークシート内に埋込みグラフ作成
sample13.rb
book_opentextメソッドの利用例(タブ区切りテキストの読込み)

sample01.rb

#! 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

sample02.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

sample03.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

sample04.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

sample05.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.quit
download sample05.rb

sample05b.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

sample06.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

sample07.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

sample08.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

sample09.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

sample10.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

sample11.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

sample12.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

sample13.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

exlapのページへ戻る