2012-07-05 67 views
1

目标:使用PHP调用将xls/xlsx文件转换为csv的vbs。将参数传递给蝙蝠(或vbs)在php中

问题:如何将源文件路径和目标文件路径传递给将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! 

index.phtml

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

注意:上述所有文件(以及conversionTestSourceMS2003.xls)都位于同一目录中。我还没有实现任何方式来传递参数(因为我不能得到,如果这一切都硬编码它甚至工作...)

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

+0

你能告诉我们一个你用来执行VBScript的PHP的例子吗?我想看看你是如何指定路径。 – jveazey 2012-07-06 03:18:51

+0

@jveazey是的,那是** index.phtml **,现在所有页面都有一个通过'system()'调用我的bat文件。所有的文件都在同一个文件夹中,所以路径_should_是正确的。我也尝试完整路径(从C :)到无效... – lostphilosopher 2012-07-06 14:06:25

+0

是否有必要使用批处理文件? – jveazey 2012-07-06 16:33:11

回答

0

为了简单起见,我将所有内容合并为一个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错误。所以,我启用detailed error messages in ASP,我得到这个下面的错误...

Microsoft Office Excel中的错误 '800a03ec'

的Microsoft Office Excel不能访问文件 '[硬编码路径 这里] \ conversionTestSourceMS2003.xls' 。有几种可能的原因:•文件名或路径不存在。 •该文件正在被其他程序使用的 。 ?试图保存的工作簿具有与当前打开的工作簿同名的 。

/temp/ExcelToCsv.asp 18行

现在,这是不是Apache的,但我相信这个问题是关系到你的。此错误意味着存在安全/权限问题,Excel无法执行访问或读取文件所需的操作。实际上,当我从PHP(在IIS中)执行VBScript(并将错误传递给链)时,我遇到了类似的错误。

我相信可以通过更改Windows用户来创建进程来解决这个问题。这可以在Services.msc中配置,方法是编辑Apache服务并将Log On选项卡更改为实际的Windows用户而不是服务帐户。不过,我还没有测试过,因为设置Apache并不是我现在可以做的事情。

+0

我用你提供的替换了我的vbs和索引,很遗憾,仍然没有得到csv。我在屏幕上也没有收到任何消息。它对你有用吗?另外,我(显然)是vbs的新手,所以如果有一个完全不同的vbs方法来实现这个目标,我会接受它。例如,文件不需要在同一个目录中,我只想消除我认为可能的错误来源。感谢您的帮助!这个问题令我疯狂。 – lostphilosopher 2012-07-06 17:16:49

+0

@lostphilosopher我更新了我的答案,以更好的方式诊断问题。现在,我不知道在DCOM中使用的确切安全设置,但这是您需要处理的地方。 – jveazey 2012-07-06 20:04:18

+0

我刚刚开始使用您的解决方案,但我认为我会在更新您的解决方案时对其进行更新。我去了Services.msc,找到了Apache2.2和wampapache。我确认wampapache是​​我正在运行并检查其“登录为”选项卡。目前它被列为“本地系统帐户”,替代方案是“网络服务”。我假设这意味着它配置正确?我会对用户/登录做更多的研究,如果有任何点击,我会发布。 – lostphilosopher 2012-07-09 14:29:53