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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

1回答

1103閲覧

openOfficeBasicのmacroをphpから起動させたい

pirogong

総合スコア6

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2018/02/01 00:39

編集2018/02/01 00:46

前提・実現したいこと

お世話になります。

web経由(php)で、openOfficeBasicのMacroでファイルを作成したいです。

現在、ターミナルのコマンドラインのphpでは成功しています。
なので、コードの問題というよりは、apacheのセキュリティなどの問題で
web経由ではmacro実行はできないのかなと思っております。

もし回避できる方法がありましたら、ご教示ください。

centos7
apache 2.4.6
php 7.0.25
LibreOffice 5.0.6.2(soffice.bin)

発生している問題

ファイルを作成するテストプログラムにて、

・ターミナルのコマンドラインではphp実行でファイルが作成されます。
$ php test.php ⇒ ファイルが作成できる

・web経由では作成されません。
httpd://XXX/test.php ⇒ ファイルが作成できない

試したこと

SELinuxは無効です。
ファイルを作成するフォルダを0777にしてみてもダメでした。
「Module1.xba」を0755にしてみてもダメでした。
shellでは、管理者権限実行にしても変化無しでした。
openOfficeコマンドのpdfへの変換は、web経由でもファイルが作成されました。

該当のソースコード

※ shellをかましているのは、PHPから直接openOfficeコマンドが使えなかったためです。

test.php

PHP

1// 引数はshellへ渡っているかの確認用なので意味はないです 2$cmd='/usr/bin/bash openoffice_basic_macro_boot.sh calc.xls'; 3echo $cmd; 4 5$results = exec($cmd); 6echo "<pre>$results</pre>";

shell ( openoffice_basic_macro_boot.sh )

#!/bin/bash echo $1 pass="XXXXXXX" echo $pass | sudo -S /opt/libreoffice5.2/program/soffice.bin --headless "macro:///Standard.Module1.test" # ↓これはファイルが作成されます # export HOME=/tmp;/opt/libreoffice5.2/program/soffice.bin --headless --nologo --nofirststartwizard --convert-to pdf --outdir /var/www/html/test/tmp /var/www/html/test/calc.xls

openOfficeBasicのMacro ( Module1.xba )

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> <!-- * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . --> <script:module xmlns:script="http://openoffice.org/2000/script" script:name="Module1" script:language="StarBasic"> REM ***** BASIC ***** Option VBASupport 1 ・・・ Sub test Dim objDoc As Object Dim objSheet As Object Dim objCell As Object Dim strMessage As String Dim inFile As String, outFile As String, tmpStr As String Dim filepath As String filepath= "/var/www/html/test/" inFile=ConvertToUrl( filepath+"calc1.xls") objDoc = StarDesktop.loadComponentFromURL(inFile, "_hidden", 0, Array()) objSheet = ThisComponent.Sheets.getByName("TEST_02") objSheet.getCellRangeByName("B6").Value=objSheet.getCellRangeByName("B6").Value objSheet.getCellRangeByName("A1").String= "セルへの書き込み" outFile=ConvertToUrl( filepath+"calc_to.xls" ) Dim lProperties(0) = New com.sun.star.beans.PropertyValue lProperties(0).Name = "Overwrite" lProperties(0).Value = true Dim lProperties(1)= New com.sun.star.beans.PropertyValue lProperties(1).Name = "FilterName" lProperties(1).Value = "MS Excel 97" objDoc.storeAsURL(outFile,lProperties()) 'ファイルを閉じる objDoc.close(True) End Sub ・・・ </script:module>

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

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

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

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

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

kenkbou

2018/05/04 09:16

わたしも同じ問題に現在困らされております。こちらは解決されましたでしょうか?
pirogong

2018/05/07 00:00

残念ながら、未解決のまま凍結しております。google検索はし尽くした感がありますので、もう新しい情報を待つのみの状況です。
kenkbou

2018/05/07 00:47

そうですよね、、、apacheから実行する権限が無い、みたいな記事も試してみてもダメでした。前にVPSで構築したサーバーは同じ方法で出来たのでサーバーのスペックも関係しているのかもしれません。
pirogong

2018/05/07 01:15

VPSで構築したサーバーで、実現したのですね。貴重な情報をありがとうございます。ちなみに実現したサーバーとそうでないサーバーの違いはどのようなものがありましたでしょうか。
kenkbou

2018/05/07 13:27

さくらのVPSの4GB、標準OS(CentOS7系)で実装した際には問題なく実行出来ました。さくらのクラウドではダメでしたね、、、AWSでもダメでした(AWS Linux、CentOSともに)
pirogong

2018/05/08 01:03

ありがとうございます!サーバーの変更は難しいですね。。。仕方ないのでマクロ付きファイルにデータを出力してダウンロードさせ、起動時に動作する方向性を考えています。
kenkbou

2018/05/09 11:50

遅くなってすみません、、マクロを書いたりする方法もあるのですね、勉強になりますmm
pirogong

2018/05/10 00:07

あ、いえいえ。言葉が足りなかったかも知れません。サーバー側で出来ないのでクライアント側でVBAを処理させようとしているだけです。VBA付きexcelファイル(*.xlsm)をサーバー側にテンプレートとして保存しておいて、PHPExcelでデータを書き込んでダウンロードさせます。起動時に必要なvbaを起動して(*.xlsx)ファイルで保存して本体(*.xlsm)を削除しようと思っています。
guest

回答1

0

コードの問題かと。
パスの指定ができていないと思われるので、openoffice_basic_macro_boot.sh
をフルパスで記述してみてください。

投稿2018/02/01 00:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pirogong

2018/02/01 00:50

ご回答ありがとうございます。 フルパスにしてみましたが変化ありませんでした。 /usr/bin/bash /var/www/html/test/openoffice_basic_macro_boot.sh calc.xls
pirogong

2018/02/01 00:58

他にも何かありましたら、ご助言いただけると助かります!
退会済みユーザー

退会済みユーザー

2018/02/01 01:07

変化がないのであれば、他にも動かないところがあるのかと。 どこまで動いているのか切り分けるのが正攻法です。 ・php がうごいているか?(sh が叩けているか?) ・sh が動いているか? ・sh がどこまで動いているか? 挙動を log に吐き出すのが良いです。 コマンドラインと web サーバ経由の違いは概ね ・環境変数 ・権限 です。 動いていない箇所は、上記2点を中心に整理すると確認できるかと。
pirogong

2018/02/01 01:24

ありがとうございます。 sh内部のコマンドをsofficeの別のオプション(PDF変換)に変更すると、web経由でもファイルが作成できます。 sofficeのmacro呼び出しオプションも、コマンドラインでの実行はファイル作成できます。 なので、php、sh、web経由自体には問題がないかと思います。 web経由のsofficeのmacro呼び出しだけが失敗します。 その状態に対して、影響しそうな環境変数はどのようなものがあるでしょうか。 もしくはOpenOfficeBasic(macro)で、外部からの呼び出しを許諾するような隠れセキュリティ設定などがあって、変更できると良いのですが。(検索した限りではそのような設定は見つかりませんでした)
退会済みユーザー

退会済みユーザー

2018/02/01 01:36

> openOfficeコマンドのpdfへの変換は、web経由でもファイルが作成されました。 これを見落としていました。 sh の呼び出しまでは、Web 経由でも問題ないということですね? では apache 権限での sh ファイルの挙動に問題があると思います。 openOffice コマンドはよく分かりませんが、パスか権限の問題を中心に確認してみては?
pirogong

2018/02/01 01:52

はい。 おっしゃる通りpdfへの変換はweb経由でOKなので、パスか権限の問題が あるとすれば、(web経由の場合の)Macroに対してかと思います。 権限は、「Module1.xba」を0755にしても変化がなかったので、 (macroはopenofficebasicの内部ファイルなので違うかもしれませんが) macroの指定をフルパスに出来る方法を探してみます。 te2jiさん、ありがとうございます。 もう少し、皆さまからのご回答を待ちたいと思います。 また何かありましたらご助言をお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問