以下に掲げるrubyスクリプトのサンプルは、Excel操縦用ライブラリ exlap.rb 最新版: exlap_latest.zipに同梱のものを利用するとの前提で書かれています。
目次
#! ruby -Ks
# mdbデータベースのsql実行結果をワークシートに読み込んで保存(odbc版)
require "exlap"
dbname = "test.mdb"
tblname = "身長と誕生日"
sql = "select 身長,氏名,ID,誕生日 from #{tblname} order by 身長 desc;"
cnn = "ODBC;DSN=MS Access Database;DBQ=#{Exl::getAbsolutePath(dbname)}"
filename = "test01.xls"
Exlap.new(filename) {|wb|
ss = wb.fes # first_empty_sheet
ss.Name = "身長順のシート"
qt = ss.QueryTables.Add({
'Connection'=>cnn,
'Destination'=>ss.Range("A1"),
'Sql'=>sql})
qt.Name = "身長順" # クエリテーブルの名前
qt.SaveData = false # 「クエリテーブルをワークブックと一緒に保存」をしない
qt.RefreshPeriod = 0 # 「定期的更新」の時間(0で無効)
qt.BackgroundQuery = false # バックグラウンド処理をしない
qt.Refresh
qt.Delete # 念のためクエリテーブルを削除
wb.save
}
download qt01.rb
#! ruby -Ks
# 設定済みクエリテーブルを更新する
require "exlap"
require "yado"
dbname = "test.mdb"
tblname = "身長と誕生日"
sql = "select 身長,氏名,ID,誕生日 from #{tblname} order by 身長 desc;"
cnn = "ODBC;DSN=MS Access Database;DBQ=#{Exl::getAbsolutePath(dbname)}"
filename = "test02.xls"
Exlap.new(filename) {|wb|
ss = wb.fes # first_empty_sheet
ss.Name = "身長順のシート"
qt = ss.QueryTables.Add({
'Connection'=>cnn,
'Destination'=>ss.Range("A1"),
'Sql'=>sql})
qt.Name = "身長順" # クエリテーブルの名前
qt.SaveData = true # 「クエリテーブルをワークブックと一緒に保存」する
qt.BackgroundQuery = false # バックグラウンド処理をしない
qt.Refresh
wb.save
ary = ss.to_a
puts "クエリテーブル更新の第1回目"
ary.each {|row|
puts row.join("\t")
}
}
# データベース更新
db = Yado.new dbname
ary = [%w(氏名 身長 誕生日),
%w(安部 190.5 1989/5/18),
%w(伊藤 158.9 1968/3/28)]
db.addnew(tblname, ary)
db.close
# Excelを再び起動して、設定済みのクエリテーブルを更新
Exlap.new(filename) {|wb|
ss = wb.ss("身長順のシート")
qt = ss.QueryTables("身長順")
qt.Refresh
wb.save
ary = ss.to_a
printf("\n")
puts "クエリテーブル更新の第2回目"
ary.each {|row|
puts row.join("\t")
}
}
download qt02.rb
#! ruby -Ks
# 複数の設定済みクエリテーブルを総て一括更新
require "exlap"
require "yado"
dbname = "test.mdb"
tblname = "身長と誕生日"
sql1 = "select 身長,氏名,ID,誕生日 from #{tblname} order by 身長 desc;"
sql2 = "select 誕生日,氏名,ID,身長 from #{tblname} order by 誕生日;"
cnn = "ODBC;DSN=MS Access Database;DBQ=#{Exl::getAbsolutePath(dbname)}"
filename = "test03.xls"
Exlap.new(filename) {|wb|
ss = wb.fes # first_empty_sheet
ss.Name = "身長順のシート"
qt = ss.QueryTables.Add({
'Connection'=>cnn,
'Destination'=>ss.Range("A1"),
'Sql'=>sql1})
qt.Name = "身長順" # クエリテーブルの名前
qt.SaveData = true # 「クエリテーブルをワークブックと一緒に保存」する
qt.BackgroundQuery = false # バックグラウンド処理をしない
qt.Refresh
ss = wb.fes
ss.Name = "誕生日順のシート"
qt = ss.QueryTables.Add({
'Connection'=>cnn,
'Destination'=>ss.Range("A1"),
'Sql'=>sql2})
qt.Name = "誕生日順" # クエリテーブルの名前
qt.SaveData = true # 「クエリテーブルをワークブックと一緒に保存」する
qt.BackgroundQuery = false # バックグラウンド処理をしない
qt.Refresh
wb.save
empty_list = wb.empty_sheet_names
puts "クエリテーブル更新の第1回目"
wb.each {|ss|
next if empty_list.include?(ss.Name)
printf("*ワークシート名: %s\n", ss.Name)
ary = ss.to_a
ary.each {|row|
puts row.join("\t")
}
printf("\n")
}
}
# データベース更新
db = Yado.new dbname
ary = [%w(氏名 身長 誕生日),
%w(渡辺 192.3 1985/11/19),
%w(山下 156.7 1971/8/3)]
db.addnew(tblname, ary)
db.close
# Excelを再び起動して、設定済みのクエリテーブルを総て一括更新
Exlap.new(filename) {|wb|
wb.obj.RefreshAll
wb.save
empty_list = wb.empty_sheet_names
puts "クエリテーブル更新の第2回目"
wb.each {|ss|
next if empty_list.include?(ss.Name)
printf("*ワークシート名: %s\n", ss.Name)
ary = ss.to_a
ary.each {|row|
puts row.join("\t")
}
printf("\n")
}
}
download qt03.rb
#! ruby -Ks
# ワークブックに記録されているクエリテーブル総ての名前を出力
require "exlap"
filename = "test03.xls"
Exlap.new(filename) {|wb|
wb.each {|ss|
next if ss.QueryTables.Count < 1
printf("*ワークシート名: %s\n", ss.Name)
ss.QueryTables.each {|qt|
printf("\t%s\n", qt.Name)
}
}
}
download qt03_2.rb
#! ruby -Ks
# mdbデータベースのsql実行結果をワークシートに読み込んで保存(ado版)
require "exlap"
dbname = "test.mdb"
tblname = "身長と誕生日"
sql = "select 身長,氏名,ID,誕生日 from #{tblname} order by 身長 desc;"
# ado接続
cnn_str = nil
case File.extname(dbname).downcase
when '.mdb'
cnn_str = "Provider=Microsoft.Jet.OLEDB.4.0;"
when '.accdb'
cnn_str = "Provider=Microsoft.ACE.OLEDB.12.0;"
end
unless cnn_str
exit
end
cn = WIN32OLE.new("ADODB.Connection")
cn.Open cnn_str + "Data Source=#{Exl::getAbsolutePath(dbname)};"
rs = WIN32OLE.new("ADODB.Recordset")
rs.CursorLocation = 3 # adUseClient クライアント側カーソルを使用
rs.Open sql,cn
# Excelを起動してsql実行結果を取り込む
filename = "test04.xls"
Exlap.new(filename) {|wb|
ss = wb.fes # first_empty_sheet
ss.Name = "身長順のシート"
qt = ss.QueryTables.Add(rs, ss.Range("A1"))
qt.Name = "身長順" # クエリテーブルの名前
qt.SaveData = false # 「クエリテーブルをワークブックと一緒に保存」をしない
qt.RefreshPeriod = 0 # 「定期的更新」の時間(0で無効)
qt.BackgroundQuery = false # バックグラウンド処理をしない
qt.Refresh
qt.Delete # 念のためクエリテーブルを削除
wb.save
}
# adoの後処理
rs.Close
cn.Close
rs = cn = nil
download qt04.rb
#! ruby -Ks
# webのtableを取り込む(web page全体ではない)
require "exlap"
url = 'http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data1s.html'
table_index = nil
filename = "test05.xls"
Exlap.new(filename) {|wb|
ss = wb.fes
ss.Name = "気象情報のシート"
qt = ss.QueryTables.Add({
'Connection'=>"URL;#{url}",
'Destination'=>ss.Range("A1")})
qt.Name = "気象情報"
qt.WebTables = table_index if table_index
qt.WebSelectionType = table_index ? XlSpecifiedTables : XlAllTables
qt.WebFormatting = XlWebFormattingAll
qt.SaveData = false # 「クエリテーブルをワークブックと一緒に保存」をしない
qt.RefreshPeriod = 0 # 「定期的更新」の時間(0で無効)
qt.BackgroundQuery = false
qt.Refresh
wb.save
}
download qt05.rb
#! ruby -Ks
# webページ全体を取り込む
require "exlap"
url = 'http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data1s.html'
filename = "test05_2.xls"
Exlap.new(filename) {|wb|
ss = wb.fes
ss.Name = "気象情報のシート"
qt = ss.QueryTables.Add({
'Connection'=>"URL;#{url}",
'Destination'=>ss.Range("A1")})
qt.Name = "気象情報"
qt.WebSelectionType = XlEntirePage # ページ全体
qt.WebFormatting = XlWebFormattingAll
qt.SaveData = false # 「クエリテーブルをワークブックと一緒に保存」をしない
qt.RefreshPeriod = 0 # 「定期的更新」の時間(0で無効)
qt.BackgroundQuery = false
qt.Refresh
wb.save
}
download qt05_2.rb
#! ruby -Ks
# テキストファイルを取り込む
require "exlap"
text_filename = "test.txt"
filename = "test06.xls"
Exlap.new(filename) {|wb|
ss = wb.fes
ss.Name = "身長と誕生日のシート"
qt = ss.QueryTables.Add({
'Connection'=>"TEXT;#{Exl::getAbsolutePath(text_filename)}",
'Destination'=>ss.Range("A1")})
qt.Name = "身長と誕生日"
qt.TextFilePromptOnRefresh = false # 更新時のファイル名再指定の有無
qt.TextFileParseType = XlDelimited # 元のデータの形式
qt.TextFileTabDelimiter = true # タブ区切り
qt.TextFileCommaDelimiter = false # カンマ切り
qt.TextFileSemicolonDelimiter = false # セミコロン区切り
qt.TextFileStartRow = 1 # 外部データの1行目から取り込む
qt.TextFilePlatform = 932 # SJIS 932, EUC-JP 20932, UTF8 65001, ASCII 1252
qt.TextFileTrailingMinusNumbers = true # マイナス記号の扱い方
qt.TextFileColumnDataTypes = Array.new(256,2) # データ型の指定
qt.SaveData = false # 「クエリテーブルをワークブックと一緒に保存」をしない
qt.RefreshPeriod = 0 # 「定期的更新」の時間(0で無効)
qt.BackgroundQuery = false
qt.Refresh
wb.save
}
download qt06.rb