在Office 2010中使用PHP的COM对象(Excel.Application)

时间:2010-11-09 18:44:12

标签: php com office-2010 comexception

我最近使用COM对象在PHP中编写了一个脚本,以便将Excel 2007电子表格中的单元格中的数据剥离为数组。这一切都是在Office 2007的XP系统上完成的。一旦我启用Apache服务器与桌面交互,脚本就像一个绝对的梦想,允许我通过PHP用数组值填充我的HTML。

现在我们刚刚升级到Win 7 x64和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>

1 个答案:

答案 0 :(得分:1)

我认为您的问题很可能是Apache没有DCOM组件的权限。作为管理员,打开DCOMCNFG.EXE。浏览器到计算机 - &gt;我的电脑 - &gt; DCOM配置并找到“Microsoft Excel应用程序”组件。右键单击此按钮并选择“属性”,然后转到“安全”选项卡。

我比我应该更懒,所以我倾向于将httpd权限授予所提供的所有三个选项,而不是费心去理解每个选项的适用时间。将单选按钮置于“自定义”,然后单击“编辑”按钮,按照标准Windows对话框为httpd运行的用户/角色添加权限。