環境
ruby 2.4.1p111
Windows10 Pro
はじめに
恐らく、殆どの企業では、Excel文化がまだまだ根強かったりする事でしょう。ファイルサーバーにExcelファイルを置いて、共有使用しているケースも普通だと思います。他の人が開いていたら、更新ができないというジレンマがあったり、自分が長時間開いていたら、気まずかったりもします。そこで、ファイルサーバーにあるExcelファイルを参照する場合は、ローカル環境にコピーしてきて、そこで、ゆっくり参照するといったやり方を時々します。この一連の作業をRubyで自動化させてみました。
やっている事は、ファイルサーバーにExcelファイルをローカル環境にコピーして、指定したシートを開くといった流れになります。Rubyソースは、バッチでコマンドを打って流しますが、割とサックリ観があって便利だったりします。
そのRubyの作り方の解説です。Excelを扱うgemはいくつかあるようですが、win32oleを利用しました。gemの名前から想像できるように、このgemは、Windows上でしか利用できない事になります。
解説
PATH変数にはExcelファイルのコピー元とコピー先のパスを指定します。FILE変数には、Excelファイルのファイル名を指定します。ローカル環境にはリネームしてコピーするようにしています。SHEET変数には、初期表示したいExcelのシート名を指定します。
Excel VBA定数のロードします。(おまじないのように)
module Excel; end
Excelオブジェクト生成します。
excel = WIN32OLE.new('Excel.Application')
表示可にして、メッセージは非表示にします。
excel.visible = true
excel.displayAlerts = false
Excelを起動します。
WIN32OLE.const_load(excel, Excel)
ExcelをOpenします。
book = excel.Workbooks.Open("#{PATH_L}#{FILE_L}")
指定したシートをアクティブにします。(上記の記述はググれば、情報は出てくるのですが、ここのやり方がググってもネットであまり流れてないようだったので、参考になるかな?)
sheet = book.sheets("#{SHEET}")
sheet.Activate
全ソース
require "fileutils"
require 'win32ole'
PATH_S = '\\\192.168.19.12\share\\'
PATH_L = 'D:\\'
FILE_S = 'エクセルファイル.xlsx'
FILE_L = 'エクセルファイル_ローカル.xlsx'
SHEET = 'ユーザー一覧'
module Excel; end
def excel_init?
begin
excel = WIN32OLE.new('Excel.Application')
excel.visible = true
excel.displayAlerts = false
WIN32OLE.const_load(excel, Excel)
puts "#{PATH_L}#{FILE_L}"
book = excel.Workbooks.Open("#{PATH_L}#{FILE_L}")
sheet = book.sheets("#{SHEET}")
sheet.Activate
true
rescue => e
puts "例外エラーが発生しました => " + e.message.to_s
false
end
end
def get_file?
unless File.exist?("#{PATH_S}#{FILE_S}")
false
else
FileUtils.cp("#{PATH_S}#{FILE_S}","#{PATH_L}#{FILE_L}")
true
end
end
unless get_file?
puts "コピー元ファイルが存在しません。"
else
puts "コピーOK"
end
puts "正常終了しました。" if excel_init?
exit
C'est fini