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