3

私は最近、COM オブジェクトを使用して Excel 2007 スプレッドシートのセルからデータを取り出して配列にするスクリプトを PHP でコーディングしました。これはすべて、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>
4

1 に答える 1

1

あなたの問題は、Apache が DCOM コンポーネントに対する権利を持っていない可能性が高いと思います。管理者として、DCOMCNFG.EXE を開きます。Browser to Computers -> My Computer -> DCOM Config を開き、「Microsoft Excel Application」コンポーネントを見つけます。これを右クリックして [プロパティ] を選択し、[セキュリティ] タブに移動します。

私は本来あるべきよりも少し怠け者なので、提供された 3 つのオプションすべてに httpd パーミッションを付与する傾向があり、それぞれのオプションがいつ適用されるかをわざわざ理解することはありません。ラジオ ボタンを [カスタマイズ] に設定し、[編集] ボタンをクリックします。標準の Windows ダイアログに従って、httpd を実行するユーザー/ロールにアクセス許可を追加します。

于 2010-11-10T11:42:25.047 に答える