2013-11-25 99 views
1

此代碼正常工作,直到它到達打開的工作簿行,然後失敗。PHP無法通過COM打開Excel工作簿

<?PHP 

$file = "C:\\xampp\\htdocs\\php\\test.xls"; 
openWorkbook($file); 

function openWorkbook($file) 
{ 
$excel = new COM("Excel.Application") or die ("ERROR: Unable to instantaniate COM!\r\n"); 
echo "Application name: {$excel->Application->value}\r\n"; 
echo "Loaded version: {$excel->Application->version}\r\n"; 

// FAILS ON THIS LINE! 
$Workbook = $excel->Workbooks->Open($file) or die("ERROR: Unable to open " . $file . "!\r\n"); 
} 

有沒有人有任何建議,爲什麼這可能會發生?我看過很多其他帖子,但沒有人似乎有這個具體問題。

回答

0

我認爲你需要使用COM而不是像PHPExcel這樣的第三方庫有一些原因。如果沒有具體原因,請考慮將這些嘗試,測試和更好支持的替代品切換到一個。


你的代碼似乎是正確的,我只能想象你有某種權限問題。

它可以是相當難以從通過COM在PHP MSO應用有意義的錯誤信息,所以這裏的一對夫婦的事情,你可以嘗試:

  • 驗證文件擴展名(.xls在你的情況下)相匹配例如,文件中的數據 - 確保沒有錯誤文件擴展名的CSV文件。 Excel(即使通過COM訪問)應該能夠處理這個問題,但是如果您在Excel應用程序中打開該文件,則會發出警告。
  • 在Excel中打開文件,輸入一個空單元格,刪除剛輸入的內容並保存。這將導致Excel重新編碼並將整個文件寫回到磁盤,這也可能有助於解決任何損壞的文件問題。
  • 確保文件具有相應的權限。做到這一點的最佳方法是將該文件設置爲「Everyone」組的完整權限,如果此問題解決了問題,則可以將權限調整爲所需的限制。

這是極不可能解決這個特定問題(文件打開代碼似乎是相同的),但它可以幫助你一點:前一段時間我寫了通過訪問Excel的一個非常小包裝庫COM,可以找到here。它的功能非常有限,但可以很容易地添加更多方法;它主要給聚會帶來的是一個稍微更清潔的API和更好的錯誤處理。

+0

首先感謝您的幫助。我試過你的建議,但無濟於事。具體的或不是特定的錯誤,我得到的是「致命的錯誤:在22行C:\ xampp \ htdocs \ php \ ExcelReader.php」。第22行是嘗試打開工作簿的行。 php.ini文件是如下... [COM_DOT_NET] 延長= php_com_dotnet.dll [COM] com.allow_dcom =真 com.autoregister_typelib =真 com.autoregister_casesensitive =假 ; COM。 autoregister_verbose = true – user3032510

+1

@ user3032510如果你的問題與ini設置有關,我會感到很驚訝,如果你對擴展本身有問題並且你的設置不會創建區分大小寫的話,我預計它會在'new COM'行失敗方法,這是我通過這個簡單的操作可以看到的唯一的其他潛在問題。請注意,COM將在錯誤時拋出異常,所以你或者die()並沒有多大意義 - 嘗試在try/catch中封裝函數體並回應異常消息。根據我的經驗,拋出的信息還是相當無用的,但你永遠不知道。 – DaveRandom