質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

rubyでwin32oleを使ってwordを操作しようとするとnewメソッドが失敗する

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,904
退会済みユーザー

退会済みユーザー

ruby1.9.3でwin32oleを使ってwordを操作するCGIプログラムを作っています。
ローカルでサーバーを立ち上げてCGIとして動かしてるのですが、win32oleオブジェクトを作ろうとWIN32OLE.newメソッドを実行する所でエラーが出ます。
同じソースを友人に試してもらったのですが、自分と違いエラーが出ず、何が原因なのか分からないまま途方にくれています。
原因に思い当たることや気になることがあるだけでも、聞いてもらえれば答えられる範囲で全て答えますので、何卒ご助言ご協力をお願いします。

問題のコード

別のソースからsessionを受け取って動作を開始します。
dbは同じフォルダにあるpstoreで作ったファイルからデータを読み込んでいます

kisei.rb

#! C:\ruby\Ruby193\bin\ruby.exe -Ks

require "cgi"
require "cgi/session"
require "pstore"
require "win32ole"
load('./word_replace.rb')

cgi = CGI.new(:accept_charset => "Windows-31J")
session = CGI::Session.new(cgi)
user_db = PStore.new("\pstore.db")

time = Time.now
time = time.strftime("%F")

name = session["name"]
number = session["number"]
sex = session["sex"]
years = "28"
begin_month = session["begin_month"]
begin_day = session["begin_day"]
begin_hour = session["begin_hour"]
begin_minutes = session["begin_minutes"]
end_month = session["end_month"]
end_day = session["end_day"]
end_hour = session["end_hour"]
end_minutes = session["end_minutes"]

db_num = "#{sex}" + "-" + "#{number}"
user_db.transaction(true) do
  stu_number = user_db["#{db_num}_stu_number"]
  dep = user_db["#{db_num}_dep"]
  year = user_db["#{db_num}_year"]
  clas = user_db["#{db_num}_class"]
  phone_number = user_db["#{db_num}_phone_number"]
end

word_name = "#{time}" + "#{db_num}" + "#{name}"

word = WIN32OLE.new("Word.Application")
doc = word.documents.open("./kisei.docx")
doc.saveas("#{word_name}.docx")
doc.close

word_rp("#{word_name}.docx", "name", "#{name}")
word_rp("#{word_name}.docx", "number", "#{db_num}")
word_rp("#{word_name}.docx", "stu_number", "#{stu_number}")
word_rp("#{word_name}.docx", "dep", "#{dep}")
word_rp("#{word_name}.docx", "year", "#{year}")
word_rp("#{word_name}.docx", "class", "#{clas}")
word_rp("#{word_name}.docx", "phone_number", "#{phone_number}")
word_rp("#{word_name}.docx", "years", "#{years}")
word_rp("#{word_name}.docx", "begin_month", "#{begin_month}")
word_rp("#{word_name}.docx", "begin_day", "#{begin_day}")
word_rp("#{word_name}.docx", "begin_hour", "#{begin_hour}")
word_rp("#{word_name}.docx", "begin_minutes", "#{begin_minutes}")
word_rp("#{word_name}.docx", "end_month", "#{end_month}")
word_rp("#{word_name}.docx", "end_day", "#{end_day}")
word_rp("#{word_name}.docx", "end_hour", "#{end_hour}")
word_rp("#{word_name}.docx", "end_minutes", "#{end_minutes}")

word.quit

header = cgi.header({"charset"=>"Shift_JIS"})
puts header

print <<EOF
<head>
<title>確認</title>
</head>

<body>
<h1>確認画面<h1>
<input type="submit" value="送信">
</body>
</html>
EOF


kisei.rbがloadしてるソースです

word_replace.rb

require "win32ole"

def word_rp (word_file, str, chang_str)
  word = WIN32OLE.new("Word.Application")

  doc = word.documents.open(word_file)
  find = word.selection.find

  find.clearformatting
  find.replacement.clearformatting
  find.text = str
  find.forward = true
  find.matchwholeword = true

  find.replacement.text = chang_str
  find.execute(nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,2)
  doc.save
  doc.close
  word.quit
end

ローカルでサーバーを動かすソース

require "webrick"

IP = "127.0.0.1"
PORT = "8080"
DOC = 'C:\Users\mi131301\Documents\ruby\PBL'
CGI_PATH = 'C:\ruby\Ruby193\bin\ruby.exe'

opts = {
  :BindAddress => IP,
  :Port => PORT,
  :DocumentRoot => DOC,
  :CGIInterpreter => CGI_PATH
}

server = WEBrick::HTTPServer.new(opts)

server.mount('/login.rb', WEBrick::HTTPServlet::CGIHandler, 'login.rb')
server.mount('/error.rb', WEBrick::HTTPServlet::CGIHandler, 'error.rb')
server.mount('/form.rb', WEBrick::HTTPServlet::CGIHandler, 'form.rb')
server.mount('/kisei.rb', WEBrick::HTTPServlet::CGIHandler, 'kisei.rb')
server.mount('/kisei2.rb', WEBrick::HTTPServlet::CGIHandler, 'kisei2.rb')

trap("INT"){server.shutdown}

server.start

出てくるエラー

[2016-01-31 21:37:23] ERROR CGIHandler: kisei.rb:
kisei.rb:40:in initialize': failed to create WIN32OLE object from Word.Applica
tion' (WIN32OLERuntimeError)
   HRESULT error code:0x80080005
     Server execution failed
       from kisei.rb:40:in new'        from kisei.rb:40:in <main>'
[2016-01-31 21:37:23] ERROR CGIHandler: kisei.rb exit with 1
[2016-01-31 21:37:23] ERROR Premature end of script headers: kisei.rb
PC131301 - - [31/Jan/2016:21:36:53 ���� (�W����)] "POST /kisei.rb HTTP/1.1" 500
321

[ブラウザでの表示]
ブラウザでの表示

[kisei.rbを実行すると出てくる]
kisei.rbを実行すると出てくる

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

「OLE 0x80080005」でググると、コンピューター名に @ が含まれているという原因が書いてありましたが、該当しませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/01 04:12

    ご質問ありがとうございます
    コンピュータ名、フルコンピュータ名ともに@は含まれていないので、このケースには当てはまらないと思います

    キャンセル

0

あれから調べて分かったのですが、oleをサーバー上で動作させるのはMicroSoftも非推奨らしく、セキュリティや管理者権限など、いろいろな設定をしてようやく動かすことが出来るらしいです。
現在はOpenXMLを推奨としているらしいので、そちらのほうでやってみようと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る