背景
Windows版Redmine限定の話になります。
自分が作っているRedmine pluginから、Excelを使いたいケースが発生しました。
gemを利用することも考えましたが、単純なCell操作だけでは済まなかったので、WIN32OLEを使って、直接Excelを操作することにしました。
はまったこと
現象
development環境で思ったように動かせるようになったのですが、
いざproduction環境で動かしてみると次のエラーが発生しました。
WIN32OLERuntimeError ((in OLE method `open': )
OLE error code:800A03EC in Microsoft Excel
ファイル 'C:¥temp¥test.xlsx' にアクセスできません。次のいずれかの理由が考えられます。
• ファイル名またはパスが存在しません。
• ファイルが他のプログラムによって使用されています。
• 保存しようとしているブックと同じ名前のブックが現在開かれています。
HRESULT error code:0x80020009
Exception occurred.):
動かしたコードはこんな感じです。
require 'win32ole'
:
def test_excel
excel = WIN32OLE.new('Excel.Application')
excel.visible = false
begin
workbook = excel.Workbooks.Open 'C:\temp\test.xlsx'
:
workbook.Close(:SaveChanges => false)
ensure
excel.Quit
end
end
解決方法
Redmine実行ユーザー(Local System)のExcel作業用フォルダを作っておきます。
Windowsが32bit、またはWindowsが64bitかつExcelが64bitの場合
C:\Windows\System32\config\systemprofile\Desktop\
Windowsが64bitかつExcelが32bitの場合
C:\Windows\SysWOW64\config\systemprofile\Desktop\
参考:IIS 実行ユーザーで DCOM を使用して Excel を扱う方法 (Windows Server 2008, 2008 R2)
調べたこと
まずはエラーで調べてみました。
OLE error code:800A03EC in Microsoft Excel
いくつか情報が出てきたので、該当しそうなところから試しました。
期待できる記事だったのですが、残念ながら現象は変わらずです。
これは自分の現象とほぼ同じ内容でしたが、質問のみの記事でした。(残念)
これは環境変数周りの設定のことが書かれていたので期待しましたが、現象は変わりませんでした。
- ファイルパスがという話を見かけましたが、ファイル名を変えると、別のエラー(ファイルが存在しないといった内容)になるのでファイルパスは大丈夫そうとわかりました。
次に、Excelそのものにアクセスできていないのでは?と考えました。
試しに、
- 新規ブックを作成
- Cellの値を設定
- 保存
しようとすると、保存のところでこけたので、Excelにはアクセスできてることがわかりました。
いよいよ万策尽きたかというときに、ふとIISではどうやってるのだろう?という疑問がわきました。
そこで、"iis excel エラー"で検索をかけて、一つ見てみました。
IIS 実行ユーザーで DCOM を使用して Excel を扱う方法 (Windows Server 2008, 2008 R2)
これでした!
Excelが動くためのフォルダが必要だということ!
development環境ではuse_redmine.batを起動してredmineを動かすので、
ログインしているユーザーのフォルダを使ってExcelが動いているということで納得です。
動いたときにはかなり感動しました!感謝です!