Help us understand the problem. What is going on with this article?

Redmine plugin開発で、WIN32OLE経由でExcelを使う場合の注意点

More than 3 years have passed since last update.

背景

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.):

動かしたコードはこんな感じです。

test.rb
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が動いているということで納得です。

動いたときにはかなり感動しました!感謝です!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away