2010-11-09 38 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运行的用户/角色添加权限。