Ruby で Excel を grep その2
試行錯誤のうえなんとか動くようになったので、公開。下の「 xlsgrep.rb 」がそのスクリプト。
Ruby をインストールした上で、コマンドラインから、
C>ruby xlsgrep.rb ruby *.xls
などとすると、xls ファイルの各シートにわたって「ruby」という文字を検索し、見つかれば行単位で表示する。
ただし、Windows 2000、Excel 97 SR-1、Ruby 1.8.1 という環境でしか確認していないので、異なる場合には念のため注意を。
今年になって Ruby を始め、はじめてつくったスクリプトなので冗長なところとか無駄なところがあるかもしれないけれど、初心者ということでご容赦を。
≫つらつらぐさ: Ruby で Excel を grep
≫つらつらぐさ: xlsgrep の捕捉(いまさら)
≫つらつらぐさ: excel ファイルを grep する(3)
追記:2008/6/30
検索するエクセルファイルをフルパスで指定しないとならないところなどを修正。
追記:2008/7/10
一応 Ruby 1.9.0 でも動くようにしてみた。
追記:2014/07/29
Excel2007 以降の xlsx ファイルを検索するのであれば、こちらをご参照ください。
xlsgrep.rb
#!ruby -Ks
# Ruby で Excel ファイルを grep する
# 2004/05/13 , 2004/05/18
require 'win32ole'
require 'fileutils'
$KCODE = "SJIS"
def usage
print "usage: ruby xlsgrep.rb <検索文字列> files...\n"
exit(1)
end
#
usage if ARGV.size < 2
pat = Regexp.new(ARGV.shift, Regexp::IGNORECASE, "SJIS")
rtemp = "c:/rtemp/"
FileUtils.rm_r(rtemp) if File.exist?(rtemp)
Dir.mkdir(rtemp)
#
module EXCEL_CONST
end
#
excel = WIN32OLE.new('Excel.Application')
excel.visible = true if $DEBUG
WIN32OLE.const_load excel, EXCEL_CONST
cdir = Dir.pwd
#
ARGV.each do |xls|
xls = File.expand_path(xls)
#
begin
print "file:#{xls}\n"
book = excel.workbooks.open xls
sc = book.worksheets.count
i = 1
while i < sc + 1
sheet = book.worksheets(i)
sheet.select
s_name = sheet.name
book.saveas rtemp + "#{s_name}.txt" , EXCEL_CONST::XlText
book.saved = true
i = i + 1
end
book.close
#
Dir.chdir(rtemp)
Dir.foreach(rtemp) do |f|
if File.fnmatch("*.txt", f)
lc = 1
File.foreach(f) do |line|
s_name = File.basename(f,".txt")
if line =~ pat
print " sheet:#{s_name} line:#{lc}\n"
print line
end
lc = lc + 1
end
end
end
print "\n"
#
Dir.foreach(rtemp) do |f|
if f =~ /\.txt/
File.delete(f)
end
end
Dir.chdir(cdir)
end
#
end
#
Dir.chdir("#{rtemp}/..")
FileUtils.rm_r(rtemp)
#
excel.quit
| 固定リンク
コメント