1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

win32oleを使って、Excelファイルを開く

Posted at

環境

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 :no_mouth:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?