NasupiiのPerl書抜帳

sheets_unprotectプログラムソースコード


Perl ソースコード

# sheets_unprotect.pl
# Copyright (C) 2013-2015 Nasupii         last update 2015/09/06
# Win32::OELを使ってMS-Excel のワークシートのプロテクトを解除するperlプログラム
# フォルダー内の全ファイルの全シートを対象にする。
# パスワードなしのプロテクトが解除できる。
# 使用確認環境
#   ActivePerl 5.16.3 と MS-Excel 2010 がインストールされた 
#     Windows Vistaにて動作確認しています。
#   ActivePerl 5.20.2 と MS-Excel 2010 がインストールされた 
#     Windows 7にても動作確認しています。
# 使い方
# 1.このプログラムをプロテクトを解除したいExcelファイルが入ったフォルダー
#   にコピーする。
# 2.このプログラムをダブルクリックする。
# 3.コマンドプロンプトのウインドウが開き、ファイルを順番に処理していく。
# 4.「Enterを押すと終了します」が出たらエンターキーを押す。
# ================================================================================

# データファイルが入っているフォルダーを指定
# "." はプログラムを実行した同じフォルダーを表す。ここを変えると他のフォルダー
# のファイルを処理対象にすることが出来る
$PATH = "."; 

#モジュールのインポート
use Win32::OLE qw(in with);                  #OLEを使用する
use Win32::OLE::Const 'Microsoft Excel';     #エクセルのデータを扱う
use Cwd;

#アプリケーションオブジェクトの取得
$Excel = Win32::OLE->GetActiveObject('Excel.Application')
     || Win32::OLE->new('Excel.Application', 'Quit');

$Excel->{DisplayAlerts} = 'False';   #警告を表示しない

# ====== ファイル一覧の取得 ======
@files = ();  #配列の初期化
opendir(DIR, $PATH);   #ディレクトリを開く
while($file = readdir(DIR)) {
  print $file, " found\n";
  next unless(-f join("/", $PATH, $file)); #ファイル以外を除外
  next if($file !~ m/\.xls/);  # エクセルファイル意外を除外
  next if($file =~ m/^~\$/);  # ~ エクセルが書き出すバックアップファイルを除外
  push(@files, "$file");
  print $file, " pushed \n";
}

foreach $file (@files) {
  #ブックを開く
  $pathname = Cwd::abs_path(join("/",$PATH, $file));  #ファイルの絶対パスを求める
  $Book = $Excel->Workbooks->Open($pathname); 
  print "\nopen ",$pathname, "\n";

  #ワークシート数を取得
  $SheetCount = $Book->Worksheets->Count();
  print "sheetcount= $SheetCount\n";

  #ワークシート1から順番に処理していく
  for ($i = 1; $i <= $SheetCount; $i++ ) {
    $Sheet = $Book->Worksheets($i);
    $SheetName = $Sheet->Name; # 現在のシートの名前を取得
    # 処理を書く
    $Sheet->UnProtect;          #ワークシートのパスワードなし保護を解除する
    print "unprotect $i :", $SheetName, "\n"
  }
  $Book->Worksheets(1)->Select(); #ワークシート1を選択状態にする
  $Book->Save;                    #ワークシートを上書き保存する
  $Book->Close() ;                #ワークシートを閉じる
  print "close ", $pathname, "\n";
}
print "Enterを押すと終了します\n";
<STDIN>;
exit;