以下に掲げるrubyスクリプトのサンプルは、Excel操縦用ライブラリ exlap.rb 最新版: exlap_latest.zipに同梱のものを利用するとの前提で書かれています。
目次
#! ruby -KS
# csv→xls変換。1つのcsvファイルを1つのExcelファイルとして出力
require "exlap"
# テスト用CSVファイルの書き出し
csv1 = <<'EOS1'
,csv01.rb用データ#1,単純なcsv→xls
001,"小数点以下が0の場合",89.0,"←元は89.0"
002,"負の小数点数",-3.00,"元は-3.00"
003,"分数","1/3","元は1/3"
004,"パーセント",50%,"実態は0.5"
EOS1
File.open("test1.csv", "w") {|fp| fp.print csv1}
csv2 = <<'EOS2'
,csv01.rb用データ#2,単純なcsv→xls
001,"元号形式の日付","平成21年10月3日","実態は2009/10/03"
002,"西暦の年月日","2010/1/7"
003,"年を省略した日付","3/10","元は3/10"
EOS2
File.open("test2.csv", "w") {|fp| fp.print csv2}
## main
csv_names = Dir.glob("*.csv") # カレントフォルダの総てのcsvファイルの名前
Exlap.new(*csv_names) {|wb|
ss = wb.ss(1)
ss.range_autofit
outfile = wb.filename.sub(/\.csv$/i, ".xls")
wb.save outfile
wb.close
}
download csv01.rb
#! ruby -KS
# csv→xls変換。1つのcsvファイルを1つのワークシートに記録。
# 数字や日付スタイルを含め、総て文字列としてワークシートに記録
require "csv"
require "exlap"
# テスト用CSVファイルの書き出し
csv1 = <<'EOS1'
,csv02.rb用データ#1,総て文字列として書き出す
001,"小数点以下が0でも省略しない",89.0
002,"負の小数点数",-3.00
003,"分数","1/3","←Excelお任せだと1月3日になる"
004,"パーセント",50%,"←Excelお任せだと実態は0.5になる"
EOS1
File.open("test1.csv", "w") {|fp| fp.print csv1}
csv2 = <<'EOS2'
,csv02.rb用データ#2,総て文字列として書き出す
001,"元号形式の日付","平成21年10月3日","←Excelお任せだと実態は2009/10/03になる"
002,"西暦の年月日","2010/1/7"
003,"年を省略した日付","3/10","←Excelお任せだと3月10日になる"
EOS2
File.open("test2.csv", "w") {|fp| fp.print csv2}
## main
xl = Exlap.new
wb = xl.book_open "test.xls"
csv_names = Dir.glob("*.csv") # カレントディレクトリのCSVファイルの名前群
csv_names.each {|filename|
data = CSV.readlines(filename)
ss = wb.fes
ss.Name = "csv02_" + File.basename(filename, ".*")
for y in 1..data.size
row = data[y-1]
for x in 1..row.size
v = row[x-1].to_s
val = v == '' ? nil : "'" + v
ss.cell(y,x).Value = val
end
end
ss.range_autofit
}
wb.save
xl.quit
download csv02.rb
#! ruby -KS
# csv→xls変換。1つのcsvファイルを1つのワークシートに記録。
# 数値の表示形式を設定しながらcsvのデータを処理
require "csv"
require "exlap"
# テスト用CSVファイルの書き出し
csv1 = <<'EOS1'
,csv03.rb用データ#1,表示形式の調整
001,"小数点以下が0でも省略しない",89.0
002,"負の小数点数",-3.00
003,"分数","0 1/3","実態は0.333……"
004,"帯分数","1 1/3","実態は1.333……"
005,"パーセント",50%,"実態は0.5"
EOS1
File.open("test1.csv", "w") {|fp| fp.print csv1}
csv2 = <<'EOS2'
,csv03.rb用データ#2,表示形式の調整
001,"元号形式の日付","平成21年10月3日","実態は2009/10/03"
002,"西暦の年月日","2010/1/7"
003,"年を省略した日付","3/10"
EOS2
File.open("test2.csv", "w") {|fp| fp.print csv2}
# 数値の表示形式を設定しながらワークシートにデータを書き込む
def set_data(cell, val)
fmt = nil # NumberFormatLocal の設定文字列をこれにセット
ii = ff = nil # ii:整数部, ff:小数部
val = val.to_s
if val =~ /^-?(\d[0-9,]*)\.(\d+)$/ # 小数点数
ii = $1
ff = $2
elsif val =~ /^-?(\d[0-9,]*)$/ # 整数
ii = $1
end
if ii
if ii =~ /^0/
fmt = ii.gsub(/\d/, "0")
else
fmt = ii.gsub(/\d/, "#")
fmt = fmt.sub(/\#$/, "0")
end
if fmt =~ /^[0#,]+([0#],[0#]{3})$/
fmt = $1
end
if ff
fmt = fmt + '.' + ff.gsub(/\d/, "0")
end
cell.NumberFormatLocal = fmt
end
cell.Value = val
end
## main
xl = Exlap.new
wb = xl.book_open "test.xls"
csv_names = Dir.glob("*.csv") # カレントディレクトリのCSVファイルの名前群
csv_names.each {|filename|
data = CSV.readlines(filename)
ss = wb.fes
ss.Name = "csv03_" + File.basename(filename, ".*")
for y in 1..data.size
row = data[y-1]
for x in 1..row.size
set_data(ss.cell(y,x), row[x-1])
end
end
ss.range_autofit
}
wb.save
xl.quit
download csv03.rb
#! ruby -KS
# 複数のワークシート各々をcsvファイルとして書き出す
require "exlap"
Exlap.new("test.xls") {|wb|
snames = wb.sheet_names - wb.empty_sheet_names # 空でないシート
snames.each {|sn|
ss = wb.ss(sn)
ss.SaveAs({'Filename'=>"#{wb.filename}_#{ss.Name}.csv",
'FileFormat'=>XlCSV, 'CreateBackup'=>false})
}
}
download csv04.rb
#! ruby -KS
# 複数のワークシート各々をタブ区切りテキストとして書き出す
require "exlap"
filename = "test.xls"
# テスト用ファイルの作成
Exlap.new(filename) {|wb|
next if test(?e, wb.filename)
ss = wb.fes
ss[1,1] = "SaveTest_01 あいうえお"
ss[1,2] = "SaveTest_01 タブコードを\t含むデータ"
ss[2,1] = "SaveTest_01 カンマを,含むデータ"
ss[2,2] = "001"; ss.cell(2,2).NumberFormatLocal = "000"
ss = wb.fes
ss[1,1] = "SaveTest_02 あいうえお"
ss[1,2] = "SaveTest_02 タブコードを\t含むデータ"
ss[2,1] = "SaveTest_02 カンマを,含むデータ"
ss[2,2] = "002"; ss.cell(2,2).NumberFormatLocal = "000"
wb.save
}
# タブ区切りテキストの出力
Exlap.new(filename) {|wb|
snames = wb.sheet_names - wb.empty_sheet_names # 空でないシート
snames.each {|sn|
ss = wb.ss(sn)
ss.Activate
wb.obj.SaveAs({'Filename'=>"#{wb.filename}_#{ss.Name}.txt",
'FileFormat'=>XlText, 'CreateBackup'=>false})
}
}
download save01.rb
#! ruby -KS
# ワークブックをhtmlファイルとして書き出す
require "exlap"
filename = "test.xls"
# テスト用ファイルの作成
Exlap.new(filename) {|wb|
next if test(?e, wb.filename)
ss = wb.fes
ss[1,1] = "SaveTest_01 あいうえお"
ss[1,2] = "SaveTest_01 タブコードを\t含むデータ"
ss[2,1] = "SaveTest_01 カンマを,含むデータ"
ss[2,2] = "001"; ss.cell(2,2).NumberFormatLocal = "000"
ss = wb.fes
ss[1,1] = "SaveTest_02 あいうえお"
ss[1,2] = "SaveTest_02 タブコードを\t含むデータ"
ss[2,1] = "SaveTest_02 カンマを,含むデータ"
ss[2,2] = "002"; ss.cell(2,2).NumberFormatLocal = "000"
wb.save
}
# htmlの出力
Exlap.new(filename) {|wb|
wb.obj.SaveAs({'Filename'=>"#{wb.filename}.htm",
'FileFormat'=>XlHtml, 'CreateBackup'=>false})
}
download save02.rb
#! ruby -KS
# ワークブックをxml-ss形式で書き出す
require "exlap"
filename = "test.xls"
# テスト用ファイルの作成
Exlap.new(filename) {|wb|
next if test(?e, wb.filename)
ss = wb.fes
ss[1,1] = "SaveTest_01 あいうえお"
ss[1,2] = "SaveTest_01 タブコードを\t含むデータ"
ss[2,1] = "SaveTest_01 カンマを,含むデータ"
ss[2,2] = "001"; ss.cell(2,2).NumberFormatLocal = "000"
ss = wb.fes
ss[1,1] = "SaveTest_02 あいうえお"
ss[1,2] = "SaveTest_02 タブコードを\t含むデータ"
ss[2,1] = "SaveTest_02 カンマを,含むデータ"
ss[2,2] = "002"; ss.cell(2,2).NumberFormatLocal = "000"
wb.save
}
# xml-ssの出力
Exlap.new(filename) {|wb|
wb.obj.SaveAs({'Filename'=>"#{wb.filename}.xml",
'FileFormat'=>XlXMLSpreadsheet, 'CreateBackup'=>false})
}
download save03.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")
# ハイパーリンクの情報を1つづつ出力
for i in 1..ss.Hyperlinks.Count
p ss.Hyperlinks(i).Range.Address # セルの絶対番地
p ss.Hyperlinks(i).Range.Address({'RowAbsolute'=>false,
'ColumnAbsolute'=>false}) # セルの相対番地
p ss.Hyperlinks(i).Address # リンク先アドレス(URIなど)
p ss.Hyperlinks(i).Name # 割り当てられているテキスト
print "\n"
end
# ハイパーリンクを開く方法
ss.Hyperlinks(1).Follow # シート内1番目のハイパーリンクを開く
# ハイパーリンクの削除
ss.Hyperlinks(1).Delete
ss.Range("B2").Hyperlinks(1).Delete
wb.save
}
download hyperlink.rb