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