MS Officeなしでエクセルにパスワードをかける

Pocket

クライアントがレポートをエクセルで欲しがる場合ってありますよね

SSISにはエクセルを出力する機能があります
ただし、今回の要件にはエクセルに読み取りパスワード設定が必須でした

でもSSISではエクセルのパスワードを設定できないんですよね

そんなエクセルにパスワードをかける方法

MS OfficeがインストールされていればVBScriptで簡単にできることまではわかりました
SSISが入っているマシンはもちろんサーバーです
なので、MS Officeなんてインストールされてません(^^)

どうにかできないか調べていたらOpenOfficeでパスワード設定ができそうなことがわかりました。
ただし、パスワード設定は、最新のOffice2007形式.xlsxではダメです。.xls形式のファイルじゃないとダメっぽい。
なので、今回は.xlsを使うことにします。

OpenOfficeでできることはわかったので、早速サーバーにインストール!

変換はVBScriptで行います。
ちなみに今回初めてVBScript書きました(^^)

'Option Explicit
'On Error Resume Next
Set OSM = WScript.CreateObject("com.sun.star.ServiceManager")

Dim MyFileNameUrl
Dim result

MyFileNameUrl = "file:///C|/tempdata/temp_template.xls"

Set oDesktop = OSM.createInstance("com.sun.star.frame.Desktop")
Set ROnly = OSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
ROnly.Name = "ReadOnly"
ROnly.Value = False
Set oCalcDoc = oDesktop.loadComponentFromURL(MyFileNameUrl,"_blank",0,Array(ROnly))

Set Pass = OSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Pass.Name = "Password"
Pass.Value = "hogepw"
Set Owrite = OSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Owrite.Name = "Overwrite"
Owrite.Value = True
Set FName = OSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
FName.Name = "FilterName"
FName.Value = "MS Excel 97"

'oCalcDoc.store()
result = oCalcDoc.storeAsURL(MyFileNameUrl, Array(Pass, Owrite,FName))
oCalcDoc.close(True)
Set oCalcDoc = Nothing
oDesktop.terminate()
Set oDesktop = Nothing

流れとしては、下記のような感じです。

  1. 書き込み可で開く
  2. パスワードをhogepwにする
  3. MS Excel97形式で上書きして保存する

FilterNameは出力するファイルの種類です。
Momonga Linux7では、下記にフィルタが定義されているようです。

/usr/lib/openoffice.org3.0/basis3.2/share/registry/modules/org/openoffice/TypeDetection/Filter

WindowsのOpenOffice3.1では下記に定義されているようです。

C:Program FilesOpenOffice.org 3BasisshareregistrymodulesorgopenofficeTypeDetectionFilter

あと、下の行のコメントを外すと上手く動作してくれませんでした。

'Option Explicit

なぜでしょうね・・・。VBScript詳しくないのでわかりません

コメントを残す