追加サンプル(csv, save, hyperlink)

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

目次

csv01.rb
csv→xls変換。1つのcsvファイルを1つのExcelファイルとして出力
csv02.rb
csv→xls変換。1つのcsvファイルを1つのワークシートに記録。。数字や日付スタイルを含め、総て文字列としてワークシートに記録
csv03.rb
csv→xls変換。1つのcsvファイルを1つのワークシートに記録。数値の表示形式を設定しながらcsvのデータを処理
csv04.rb
複数のワークシート各々をcsvファイルとして書き出す
save01.rb
複数のワークシート各々をタブ区切りテキストとして書き出す
save02.rb
ワークブックをhtmlファイルとして書き出す
save03.rb
ワークブックをxml-ss形式で書き出す
hyperlink.rb
ハイパーリングの情報確認・オープン・削除

csv01.rb

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

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

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

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

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

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

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

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

exlapのページへ戻る