2010-11-09 35 views
2

我最近使用COM對象編寫了一個PHP腳本,用於將數據從Excel 2007電子表格中的單元格中去除到數組中。這一切都是在Office 2007的XP系統上本地完成的。一旦我啓用Apache服務器與桌面進行交互,腳本就像絕對的夢一樣工作,允許我通過PHP填充我的HTML與數組值。在Office 2010中使用PHP的COM對象(Excel.Application)

現在我們剛剛升級到Win 7的64位和Office 2010 32位 - 相同的腳本現在拋出我發出com_exception:

「Microsoft Excel不能訪問」的XML/xmlx文件(它的工作對兩先前)。 「有幾個可能的原因:

  • 文件名或路徑不存在
  • 文件正被另一個程序使用
  • 您試圖保存工作簿具有相同的名稱作爲。目前開放的工作簿「......顯然。

我已禁用UAC還以爲那就是允許Apache以與桌面交互的罪魁禍首,當然還有,而是一個Excel進程甚至沒有嘗試啓動。我猜測Windows 7不允許腳本與Excel進行交互。還有其他腳本可以使用類(例如PHPExcel),但是我寧願避免編寫收件人代碼,另外我甚至不知道這些類是否適用於Excel 2010.

我該如何克服這種錯誤com_exception

代碼:

<?php 
error_reporting(E_ALL); 

function getDataFromExcel($file, $sheet, $rows, $cols) 
{ 
    // COM CREATE 
    fwrite(STDOUT, "----------------------------------------\r\n"); 
    $excel = new COM("Excel.Application") or die ("ERROR: Unable to instantaniate COM!\r\n"); 
    $excel->Visible = true; // so that we see the window on screen 
    fwrite(STDOUT, "Application name: {$excel->Application->value}\r\n") ; 
    fwrite(STDOUT, "Loaded version: {$excel->Application->version}\r\n"); 
    fwrite(STDOUT, "----------------------------------------\r\n\r\n"); 

    // DATA RETRIEVAL 
    $Workbook = $excel->Workbooks->Open($file) or die("ERROR: Unable to open " . $file . "!\r\n"); 
    $Worksheet = $Workbook->Worksheets($sheet); 
    $Worksheet->Activate; 
    $i = 0; 
    foreach ($rows as $row) 
    { 
     $i++; $j = 0; 
     foreach ($cols as $col) 
     { 
      $j++; 
      $cell = $Worksheet->Range($col . $row); 
      $cell->activate(); 
      $matrix[$i][$j] = $cell->value; 
     } 
    } 

    // COM DESTROY 
    $Workbook->Close(); 
    unset($Worksheet); 
    unset($Workbook); 
    $excel->Workbooks->Close(); 
    $excel->Quit(); 
    unset($excel); 

    return $matrix; 
} 

// define inputs 
$xls_path = "D:\\xampp\\htdocs\\path_to_document\\test.xls"; // input file 
$xls_sheet = 1; // sheet #1 from file 
$xls_rows = range(3, 20, 1); // I want extract rows 3 - 20 from test.xls with 1 row stepping 
$xls_cols = array("B", "D", "E", "G"); // I want to extract columns B, D, E and G from the file 

// retrieve data from excel 
$data = getDataFromExcel($xls_path, $xls_sheet, $xls_rows, $xls_cols); 

?> 
<html> 
<pre> 
<?php print_r ($data);?> 
</pre> 
</html> 
+0

一般來說,PHPExcel雖然不一定是解決方案,但可以讀/寫xlsx文件(無論是由Excel 2007還是由Excel 2010生成)。 – 2010-11-09 19:52:44

回答

1

我覺得你的問題是最有可能的是Apache不具有權限的DCOM組件。以管理員身份打開DCOMCNFG.EXE。瀏覽器到計算機 - >我的電腦 - > DCOM配置並找到「Microsoft Excel應用程序」組件。右鍵單擊並選擇「屬性」,然後轉到安全選項卡。

我比我應該是一個比較懶惰的人,所以我傾向於給所有提供的三個選項授予httpd權限,而不是費力地理解每個選項適用的時間。將單選按鈕設置爲「自定義」,然後點擊「編輯」按鈕,按照標準Windows對話框向您的httpd運行的用戶/角色添加權限。