クライアントがレポートをエクセルで欲しがる場合ってありますよね
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
流れとしては、下記のような感じです。
- 書き込み可で開く
- パスワードをhogepwにする
- 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詳しくないのでわかりません