1

目的: PHP を使用して、xls/xlsx ファイルを csv に変換する vbs を呼び出します。

質問: xls/xlsx を csv に変換する vbs にソース ファイル パスと宛先ファイル パスを渡し、その vbs を PHP Web アプリケーションで実行するにはどうすればよいですか?

詳細:ソース ファイル パスと宛先ファイル パスを受け取り、ソース ファイル パスの xls/xlsx を csv に変換する作業中の vbs があります。Windows のコマンドラインから実行でき、やりたいことを正確に実行します。実行コマンドをbatファイルに入れてbatファイルを実行することで、同じ結果を得ることもできます。ただし、PHP で exec()/shell_exec()/system() を使用して同じコマンドを実行すると、csv が作成されません。(system() を使用して PHP からバットを実行しようとすると、バット ファイルの内容がページに表示されます。実際、echo Conversion complete! は「echo Conversion complete! Conversion complete.」と出力します)。エラーはまだありません。

注: PHPExcel については知っていますが、使用したくありません。

excelToCsv.vbs

On Error Resume Next
if WScript.Arguments.Count < 2 Then WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file>"
Wscript.Quit
End If
csv_format = 6
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.SaveAs dest_file, csv_format
oBook.Close False
oExcel.Quit

batConverter.bat

excelToCsv.vbs conversionTestSourceMS2003.xls batTest.csv
echo Conversion Complete!

index.phtml

<?php
system("cmd /c batConvert.bat")
?>

注:上記のファイルはすべて (conversionTestSourceMS2003.xls と共に) 同じディレクトリにあります。パラメータを渡す方法を実装していません(すべてハードコードされていても動作させることができないため...)

セットアップ: PHP5、Zend Framework、WAMP、Windows 7 (localhost)。

4

1 に答える 1

0

簡単にするために、すべてを 1 つの ASP ページにまとめました。これにより、IIS で同様の問題を確認できる可能性があります。これは単一の ASP スクリプト内にあるため、エラーをより直接的に確認できます。私のテスト マシンは、Excel 2007 SP3 を搭載した IIS7 上の Windows Vista SP2 で実行されています。

excelToCsv.asp

<%

Option Explicit

Dim csv_format, src_file, dest_file, strPath, objFSO

csv_format = 6
src_file = "conversionTestSourceMS2003.xls"
dest_file = "testbat.csv"

strPath = "[HARDCODED PATH HERE]\"
src_file = strPath & src_file
dest_file = strPath & dest_file

Dim objExcel, objBook
Set objExcel = CreateObject("Excel.Application")

Set objBook = objExcel.Workbooks.Open(src_file)
objBook.SaveAs dest_file, csv_format
objBook.Close False

Response.Write "Conversion Complete!"
objExcel.Quit

%>

このコードを実行すると、一般的な ASP エラーが発生しました。そのため、ASP で詳細なエラー メッセージを有効にすると、次のエラーが表示されます...

Microsoft Office Excel エラー '800a03ec'

Microsoft Office Excel は、ファイル '[HARDCODED PATH HERE]\conversionTestSourceMS2003.xls' にアクセスできません。いくつかの理由が考えられます。 • ファイル名またはパスが存在しない。? ファイルが別のプログラムによって使用されています。? 保存しようとしているブックは、現在開いているブックと同じ名前です。

/temp/ExcelToCsv.asp、18 行目

さて、これは Apache ではありませんが、問題はあなたの問題に関連していると思います。このエラーは、Excel がファイルへのアクセスまたは読み取りに必要な処理を実行できないという、セキュリティ/アクセス許可の問題があることを意味します。実際、(IIS で) PHP から VBScript を実行している (そしてチェーンにエラーを渡している) ときに、同様のエラーが発生しました。

プロセスの作成に使用されている Windows ユーザーを変更することで解決できると思います。これは、Apache サービスを編集し、[ログオン] タブをサービス アカウントではなく実際の Windows ユーザーに変更することで、Services.msc で構成できます。ただし、Apache のセットアップは今すぐできることではないため、まだテストしていません。

于 2012-07-06T16:49:07.437 に答える