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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

2回答

4471閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/01/31 15:21

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

###問題のコード

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

kisei.rb

ruby

1#! C:\ruby\Ruby193\bin\ruby.exe -Ks 2 3require "cgi" 4require "cgi/session" 5require "pstore" 6require "win32ole" 7load('./word_replace.rb') 8 9cgi = CGI.new(:accept_charset => "Windows-31J") 10session = CGI::Session.new(cgi) 11user_db = PStore.new("\pstore.db") 12 13time = Time.now 14time = time.strftime("%F") 15 16name = session["name"] 17number = session["number"] 18sex = session["sex"] 19years = "28" 20begin_month = session["begin_month"] 21begin_day = session["begin_day"] 22begin_hour = session["begin_hour"] 23begin_minutes = session["begin_minutes"] 24end_month = session["end_month"] 25end_day = session["end_day"] 26end_hour = session["end_hour"] 27end_minutes = session["end_minutes"] 28 29db_num = "#{sex}" + "-" + "#{number}" 30user_db.transaction(true) do 31 stu_number = user_db["#{db_num}_stu_number"] 32 dep = user_db["#{db_num}_dep"] 33 year = user_db["#{db_num}_year"] 34 clas = user_db["#{db_num}_class"] 35 phone_number = user_db["#{db_num}_phone_number"] 36end 37 38word_name = "#{time}" + "#{db_num}" + "#{name}" 39 40word = WIN32OLE.new("Word.Application") 41doc = word.documents.open("./kisei.docx") 42doc.saveas("#{word_name}.docx") 43doc.close 44 45word_rp("#{word_name}.docx", "name", "#{name}") 46word_rp("#{word_name}.docx", "number", "#{db_num}") 47word_rp("#{word_name}.docx", "stu_number", "#{stu_number}") 48word_rp("#{word_name}.docx", "dep", "#{dep}") 49word_rp("#{word_name}.docx", "year", "#{year}") 50word_rp("#{word_name}.docx", "class", "#{clas}") 51word_rp("#{word_name}.docx", "phone_number", "#{phone_number}") 52word_rp("#{word_name}.docx", "years", "#{years}") 53word_rp("#{word_name}.docx", "begin_month", "#{begin_month}") 54word_rp("#{word_name}.docx", "begin_day", "#{begin_day}") 55word_rp("#{word_name}.docx", "begin_hour", "#{begin_hour}") 56word_rp("#{word_name}.docx", "begin_minutes", "#{begin_minutes}") 57word_rp("#{word_name}.docx", "end_month", "#{end_month}") 58word_rp("#{word_name}.docx", "end_day", "#{end_day}") 59word_rp("#{word_name}.docx", "end_hour", "#{end_hour}") 60word_rp("#{word_name}.docx", "end_minutes", "#{end_minutes}") 61 62word.quit 63 64header = cgi.header({"charset"=>"Shift_JIS"}) 65puts header 66 67print <<EOF 68<head> 69<title>確認</title> 70</head> 71 72<body> 73<h1>確認画面<h1> 74<input type="submit" value="送信"> 75</body> 76</html> 77EOF 78

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

word_replace.rb

ruby

1require "win32ole" 2 3def word_rp (word_file, str, chang_str) 4 word = WIN32OLE.new("Word.Application") 5 6 doc = word.documents.open(word_file) 7 find = word.selection.find 8 9 find.clearformatting 10 find.replacement.clearformatting 11 find.text = str 12 find.forward = true 13 find.matchwholeword = true 14 15 find.replacement.text = chang_str 16 find.execute(nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,2) 17 doc.save 18 doc.close 19 word.quit 20end

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

ruby

1require "webrick" 2 3IP = "127.0.0.1" 4PORT = "8080" 5DOC = 'C:\Users\mi131301\Documents\ruby\PBL' 6CGI_PATH = 'C:\ruby\Ruby193\bin\ruby.exe' 7 8opts = { 9 :BindAddress => IP, 10 :Port => PORT, 11 :DocumentRoot => DOC, 12 :CGIInterpreter => CGI_PATH 13} 14 15server = WEBrick::HTTPServer.new(opts) 16 17server.mount('/login.rb', WEBrick::HTTPServlet::CGIHandler, 'login.rb') 18server.mount('/error.rb', WEBrick::HTTPServlet::CGIHandler, 'error.rb') 19server.mount('/form.rb', WEBrick::HTTPServlet::CGIHandler, 'form.rb') 20server.mount('/kisei.rb', WEBrick::HTTPServlet::CGIHandler, 'kisei.rb') 21server.mount('/kisei2.rb', WEBrick::HTTPServlet::CGIHandler, 'kisei2.rb') 22 23trap("INT"){server.shutdown} 24 25server.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を実行すると出てくる

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2016/02/01 06:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2016/01/31 17:18

otn

総合スコア84864

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/01/31 19:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問