1

Objective:使用 PHP 调用 vbs 将 xls/xlsx 文件转换为 csv。

问题:如何将源文件路径和目标文件路径传递给将 xls/xlsx 转换为 csv 并在 PHP Web 应用程序中运行该 vbs 的 vbs?

详细信息:我有一个工作 vbs,它采用源文件路径和目标文件路径,并将源文件路径中的 xls/xlsx 转换为 csv。我可以从 Windows cmd 行执行它,它完全符合我的要求。我也可以把执行命令放到一个bat文件中,运行bat文件也可以达到同样的效果。但是,当我在 PHP 中使用 exec()/shell_exec()/system() 执行相同的命令时,不会创建 csv。(如果我尝试使用 system() 从 PHP 运行 bat,bat 文件的内容会显示在页面上,实际上,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!

索引.phtml

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

注意:以上所有文件(连同conversionTestSourceMS2003.xls)都在同一个目录中。我还没有实现任何传递参数的方法(因为即使它都是硬编码的,我也无法让它工作......)

设置: PHP5、Zend 框架、WAMP、Windows 7(本地主机)。

4

1 回答 1

0

为简单起见,我将所有内容合并到一个 ASP 页面中。这将使我有希望在 IIS 中看到类似的问题,并且由于它在单个 ASP 脚本中,我将能够更直接地看到错误。我的测试机器在 IIS7 上的 Windows Vista SP2 和 Excel 2007 SP3 上运行。

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 无法执行访问或读取文件所需的操作。事实上,当我从 PHP(在 IIS 中)执行 VBScript(并将错误向上传递)时,我遇到了类似的错误。

我相信可以通过更改用于创建进程的 Windows 用户来解决它。这可以通过编辑 Apache 服务并将“登录”选项卡更改为实际的 Windows 用户而不是服务帐户来在 Services.msc 中进行配置。不过,我还没有对其进行测试,因为我现在无法设置 Apache。

于 2012-07-06T16:49:07.437 回答