読者です 読者をやめる 読者になる 読者になる

Excelのシート一覧が欲しい

今日、はてなブックマークを眺めていたら、Yahoo!知恵袋の質問が目に入りました。detail.chiebukuro.yahoo.co.jp



みんな、似たようなこと考えるんですね。私も以前、複数Excelファイルのなかの複数のシート一覧が欲しくなったので、Ruby と Win32OLE を利用して雑にシート一覧を取得するスクリプトを書いたことがあります。
せっかくなので、久しぶりに動かしてみました。手元にある Windows 7 Pro 64bit, Office 2007 環境に Ruby Installer 2.2.2 を入れてみたところ、問題なく動きました。

#!ruby -Ks

require 'date'
require 'win32ole'

#----------
file_dir   = 'C:\dev\work\files'

xls_files  = '*.xls'
xlsx_files = '*.xlsx'
#----------


def getPath(filename)
  f = WIN32OLE.new('Scripting.FileSystemObject')
  return f.GetAbsolutePathName(filename)
end

def getData(filename, excel, output_sheet, num)
  book = excel.Workbooks.Open(filename)
  
  begin
    worksheet_num = 0
    book.WorkSheets.each do |sheet|
      num = num + 1
      output_A = "A" + num.to_s
      output_B = "B" + num.to_s

      output_sheet.Range(output_A).value = book.Name
      output_sheet.Range(output_B).value = sheet.Name
    end
    ensure
    book.Close
  end
  
  return num
end


excel = WIN32OLE.new('Excel.Application')
output_book  = excel.workbooks.add
output_sheet = output_book.Worksheets(1)

counter = 0

Dir.chdir(file_dir)
Dir.glob(xls_files) do |f|
  filename = getPath(f)
  counter = getData(filename, excel, output_sheet, counter)
end

Dir.glob(xlsx_files) do |f|
  filename = getPath(f)
  counter = getData(filename, excel, output_sheet, counter)
end

t = Time.now
output_filename = t.strftime("%Y%m%d_%H%M") + '.xlsx'
output_filepath = file_dir + '\_' + output_filename

output_book.saveAs output_filepath
output_book.Close


C:¥dev¥work¥files 以下にある xls, xlsx ファイルについて、A列にファイル名を、B列にファイル名を出力します。
f:id:shiget84:20150601233419p:plain
f:id:shiget84:20150601233541p:plain

取得できました! わーい!



さて、取得できたのはよいのですが、とりあえず動けばいいやという雑なコードですね。
僕は仕事で Ruby を使ったことがなく手元で参考書とかみながら書いているというレベルなので、ちゃんとした書き方など教えてください。
というか、こういうのこそ GitHub に載せるべきですね。そのうちやります...