PHP 也有支援 COM 元件的介面

對專題的經驗分享、心得、閒聊等

版主: rachel

分享到: Facebook

PHP 也有支援 COM 元件的介面

文章XO » 週五 11月 03, 2006 10:50 pm

這一篇可以看一下:10個 PHP小秘訣 在 Windows系統呼叫 COM 元件

範例是講用 PHP 去讀寫 Word 檔,知道 Excel Object model 的話,可以依樣畫葫蘆。
我手邊這一本 2001 年的「當PHP與MySQL遇上Windows 2000」老了些,但是第九章整章都在探討 PHP 與 COM。

這一篇範例更是清楚:Excel To MySQL Via PHP ODBC And COM
以下程式係摘錄自上面這一篇。是一個經由 PHP 透過微軟 COM 元件技術,以 Excel Object Model 來直接讀寫 Excel 的範例腳本...

代碼: 選擇全部
[size=150]$xls = new COM("Excel.sheet") or die("Did not connect");
print "Application name:{$xls->[color=blue][b]Application[/b][/color]->value}\n";
print "Loaded Version: {$xls->Application->version}\n";
foreach($years as $year)
{
  $workbook = "C:\weather\_" . $year . ".xls"; 
  $wkb = $xls->Application->[color=blue][b]Workbooks[/b][/color]->Open($workbook)
         or die("Failed to Open Workbook");
  $xls->Application->Visible = 1;
  foreach($sheets as $sheet)
  {
    $month = (array_search($sheet, $sheets) + 1);
    $ws = $wkb->[color=blue][b]Worksheets[/b][/color]($sheet);
    $ws->activate;
    for ($day = 1, $i = First_Cell;
         $i <= Last_Cell; $i++, $day++)
    {
      if (checkdate($month, $day, $year))
      {
        $arr_day[0] = $year . "-"
                    . $month . "-" . $day;
        $cell = $ws->[color=blue][b]Cells[/b][/color]($i, AD);
        $cell->activate;
        $arr_day[1] = (! empty($cell->value))
                    ? sprintf("%01.1f", $cell->value)
                    : NULL; 
        $cell = $ws->Cells($i, AA);
        $cell->activate;
        $arr_day[2] = (! empty($cell->value))
                    ? round($cell->value)
                    : NULL;         
        $values[] = $arr_day;
      }     
    }
  }
  $xls->Application->[color=blue][b]ActiveWorkbook[/b][/color]->Close("False");
}
$xls->Release();
unset($xls);[/size]



如果想要知道 Excel Object Model 可以看這邊:http://msdn2.microsoft.com/en-us/library/wss56bz7.aspx

要將 Excel 拿來作為專題的「做報表工具」,是粉可行且容易的事。好處是彙整在 Excel 裡的「資訊」,可以進一步再加工,做成 Chart... 等更易於被 Visualized 的方式來呈現,或是再套用 Excel 公式所可以製作成的各式「分析模型」,來產生更深一層的資訊。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5473
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:PHP 也有支援 COM 元件的介面

文章XO » 週六 11月 04, 2006 2:00 am

這是另外一個不需透過 COM 的 Package Information: Spreadsheet_Excel_Writer,有兩篇文章/討論:

eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5473
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:PHP 也有支援 COM 元件的介面

文章XO » 週六 11月 04, 2006 10:50 am

昱瑋:

有在線上嗎?
感覺昨天跟你討論的方向,蠻可行的,雖然沒寫過 PHP 不過前面摘錄那一段 PHP 程式,我看得懂耶!

一個感覺,接觸過好些個 Scripting language,像是 Tcl, Python, Ruby, Perl, PHP, .... 其實都粉有 C/C++ 身影,還真的可以「吾一以貫之」。

印象中 PHP 一定要內嵌到網頁裡執行,是不是?

還是說現在腳本化技術發達,PHP 也可以有個 Console 來執行腳本甚麼的?
有 eOffice 成員路過的可以分享一下經驗的嗎? 如果我要玩 PHP 有沒個簡易上手的的傻瓜套件?嗯!有沒啥 Live CD 打包成 VMware 的,我實在不想讓我的機器安裝得太複雜... 開機已經是越來越慢囉...

這麼多年專題評分下來,一直都覺得同學系統好像對於一些管理性表報較為欠缺。

ERP 領域裡,粉多套裝軟體都以 Excel 作為輸出表報的平台,也有些直接輸出成 PDF 檔,不過我覺得輸出到 Excel 上應該比較有 Potential。

試想「套表硬刷」的觀念,更可以在 Reporting 作業上也同樣可以採用 MVC model,把 View 部分的「Presentation Lay」抽離出來,會 Excel 的 End users 比比皆是,報表要長得甚麼樣?讓用戶來決定,或是了不起提供個範本/樣版之類的,把 Generated 的「情報」作成表格填空的欄位(如何做成Position Independent 會是關鍵技術,不過好像不難),其他美編安排讓用戶來,一但處理過的 data 變成的彙總情報資訊放到 Excel 裡之後,Chart, Pivot Table,... 甚麼的一啟用上來,可是會如虎添翼的說!
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5473
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:PHP 也有支援 COM 元件的介面

文章XO » 週六 11月 04, 2006 10:28 pm

呵呵!

頂樓上面那段程式嚐試了 一下,搞定啦....
我做了一個簡單一點兒的範例:

代碼: 選擇全部
#!/usr/bin/env php -q

<?php
  $xls = new COM("Excel.sheet") or die("Did not connect");
  print "Application name:{$xls->Application->value}\n";
  print "Loaded Version: {$xls->Application->version}\n";
  $xlsFile = "C:\\tmp\\byPhp.xls"; 
  $workbook = $xls->Application->Workbooks->Open($xlsFile)
         or die("Failed to Open Workbook");
  $xls->Application->Visible = 1;
 
  $worksheet = $workbook->Worksheets("Sheet1");
  $worksheet->activate;
  $worksheet->Cells(1, 1)->value = 100;
  $worksheet->Cells(2, 1)->value = 20;
  $worksheet->Cells(3, 1)->formula = "=A1 + A2";
  print "100 + 20 = " . $worksheet->Cells(3, 1)->value;
  $workbook->Saved = 0;
  $xls->Application->Quit();   
  unset($xls);
?>


這段程式會打開一個既有的 C:\tmp\byPhp.xls 試算表,在 A1 欄位填入 100,A2 填入 20,然後在 A1 登記一個公式 (=A1 + A2),再取回 A3 儲存格計算出來的結果,印在 Console 上。然後結束 Excel, 結束前,做一個確認,問說要不要儲存。

假如 $workbook->Saved 設為 1 的話(是在告訴Excel已經儲存過),下面那一郭 Quit() 它會連問都不問就結束掉。也不會儲存 xls 檔案。


看個示意圖吧... (a little messy... sorry about that, that's the best I can do, for now.)


圖檔
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5473
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:PHP 也有支援 COM 元件的介面

文章copyleft » 週六 11月 04, 2006 10:41 pm

如果要用 php 產生 excel 檔案, 還有另外一種簡單方便的方式,

http://www.phpdc.com/article/18/

只要用一般寫入檔案的方式, 把副檔名存成 xls 就可以了, 缺點就是不容易設定各個欄位的格式。
頭像
copyleft
E-Office 小組
 
文章: 1006
註冊時間: 週六 8月 07, 2004 11:27 am
來自: Taiwan


回到 專題經驗交流

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron