Использование COM-объекта PHP с Office 2010 (Excel.Application) - PullRequest
3 голосов
/ 09 ноября 2010

Недавно я закодировал скрипт в PHP, используя объект COM для удаления данных из ячеек электронной таблицы Excel 2007 в массив.Все это было сделано локально в системе XP с Office 2007. После того, как я позволил серверу Apache взаимодействовать с рабочим столом, сценарий работал, как абсолютная мечта, что позволило мне заполнить мой HTML значениями массива через PHP.

Теперь мы только что обновились до Win 7 x64 и 32-разрядной версии Office 2010 - тот же сценарий теперь выдает мне исключение COM_exception:

«Microsoft Excel не может получить доступ» к файлу xml / xmlx (он работалдля обоих ранее)."Существует несколько возможных причин:

  • Имя файла или путь не существует.
  • Файл используется другой программой.
  • Рабочая книга, которой вы являетесьпопытка сохранения имеет то же имя, что и текущая открытая книга "... очевидно.

Я отключил UAC, считая его виновником, и, конечно, позволил Apache взаимодействовать с рабочим столом, но процесс Excel даже не пытается запустить.Я предполагаю, что Windows 7 вообще не позволяет скрипту взаимодействовать с Excel.Существуют и другие сценарии, использующие классы (например, PHPExcel), однако я бы предпочел не писать код получателя, плюс я даже не знаю, будут ли классы работать в Excel 2010.

Как мне преодолеть это com_exception ?

Код:

<code><?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);?>

1 Ответ

1 голос
/ 10 ноября 2010

Я думаю, что ваша проблема, скорее всего, в том, что у Apache нет прав на компонент DCOM.Как администратор, откройте DCOMCNFG.EXE.Откройте «Компьютеры» -> «Мой компьютер» -> «Настройка DCOM» и найдите компонент «Приложение Microsoft Excel».Щелкните правой кнопкой мыши на этом и выберите «Свойства», затем перейдите на вкладку «Безопасность».

Я немного ленив, чем, вероятно, должен быть, поэтому я склонен предоставлять разрешения httpd для всех трех предоставленных опций,а не пытаться понять, когда каждый из них применяется.Установите переключатель в положение «Настроить» и нажмите кнопку «Изменить», следуйте стандартным диалоговым окнам Windows, чтобы добавить разрешения пользователю / роли, под которой работает httpd.

...