<blockquote id="te0ae"><del id="te0ae"></del></blockquote>
<thead id="te0ae"><del id="te0ae"></del></thead>
<thead id="te0ae"></thead>
<i id="te0ae"><option id="te0ae"><listing id="te0ae"></listing></option></i>
<optgroup id="te0ae"><del id="te0ae"></del></optgroup>
  • 智能云排名SEO內測

    百度關鍵詞優化三天上首頁!同行都是朋友, 歡迎一起互利共贏。謝絕一切非正規行業服務,感謝以下同行、團隊、平臺和代理的支持:

    百度站長平臺、MIP開發小組、SEO焦大老友、SEO每天一貼ZAC大哥、盧松松大哥、,嶴EO兄弟、附子SEO兄弟、探索者SEO、幫站SEO好友、互點寶、超快排平臺

    百億互刷寶、下拉天下、SEO自學網、SEO研究中心、小明SEO、王德春SEO、馬海祥博客、踏雪無痕掛機工作室、SEO云優化好友、云客網、杭州思億歐、網賺吧、北京SEO韓非老弟

    需要了解以上同仁的相關信息,我們已經給你做好了搜索框,看右上角綠色那個,輸入搜索即刻直達

    網站統計: 共有讀稿:14437部 / 今日更新:篇 / 評論:19條 / 會員:75 名 / 閱讀:1086085
    您好,請 【登陸】/【注冊】
    軟件內容頁橫幅廣告
    您現在的位置:SEO平臺 > PHP網站建設 >

    在Windows系統下使用PHP生成Word文檔的教程

    2018.04.20

    瀏覽:

    【導語】如果您覺得本篇內容還不錯,請點擊文章下面的贊,然后分享給朋友哦!...

    在Windows系統下使用PHP生成Word文檔的教程-破洛洛教學網...請看詳情...

    seo

    seo

    在Windows系統下使用PHP生成Word文檔的教程
    準備工作

    首先,請確保在你的Windows系統中已經安裝并配置好了一個典型的WAMP環境。由于Interop純粹是一個Windows的特性,我們將在Windows平臺下搭建Apache和PHP。在這個實例中,我使用了EasyPHP 14.1,這款軟件安裝和配置都十分容易。

    接下來,我們要安裝Microsoft Office。版本不是嚴格要求的。我正在使用的是Office2013專業版,但是任何2007之后的Office版本都應該可以使用。

    我們然后需要去確保開發Interop應用(又被稱作PIA,優先交互組件)的庫是安裝好的。為了確保這個,我們可以打開資源管理器,然后找到<Windows目錄>\assembly,我們將會看到下面安裝好的PIAs分支:

    201573144223171.png (1050×656)

    我們可以看到一個 Microsoft.Office.Interop.Word 條目(在這個截圖中有下劃線)。 這就是我們在這個示例中將要使用的 PIA。請特別注意它的“名稱”,“版本”和“公鑰標記”。我們將要在PHP腳本中用到它們。

    在這個目錄中,我們還可以看到其它用于編程(不僅是PHP,還有VB.net, C#等)的PIAs(包括整個Office家族)。

    如果這個列表沒有包含 Microsoft.Office.Interop 的整個包,我們可以重新安裝Office并且在安裝中包含PIA;我們也可以手動下載安裝這個包。安裝的詳細步驟可以查閱這個MSDN頁面。

    注意:只有Microsoft Office 2010 PIA Redistributable 可以被單獨下載安裝。這個包中的 PIA 版本是14.0.0。版本15只能通過安裝Office獲得。

    最后,我們需要在文件 php.ini 中啟用 PHP 擴展 php_com_dotnet.dll,并且重啟服務器。

    現在我們可以開始編程了。

    HTML表單

    由于該demo主要關注與后臺的處理,所以我們這里就用一個簡單的HTML表單做前臺的展示,看起來應該是這樣的:

    201573144251848.png (889×757)

    我們有一個文本框用于輸入“Name”,一個“Gender”的單選按鈕組,一個“Age”的域值控制還有一個文本域來寫“Message”,最后,還需要一個“Submit”按鈕。

    將該文件命名為“index.html”,保存在虛擬主機的根目錄下,這樣我們可以直接通過URL訪問該文件,例如:http://test/test/interop

    后臺

    后臺的PHP文件是我們所要討論的核心部分。我先將代碼貼到下面,接下來在一步一步的進行解釋
     

    <?php
     
    $inputs = $_POST;
    $inputs['printdate']=''; 
    // A dummy value to avoid a PHP notice as we don't have "printdate" in the POST variables. 
     
    $assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
    $class = 'Microsoft.Office.Interop.Word.ApplicationClass';
     
    $w = new DOTNET($assembly, $class);
    $w->visible = true;
     
    $fn = __DIR__ . '\\template.docx';
     
    $d = $w->Documents->Open($fn);
     
    echo "Document opened.<br><hr>";
     
    $flds = $d->Fields;
    $count = $flds->Count;
    echo "There are $count fields in this document.<br>";
    echo "<ul>";
    $mapping = setupfields();
     
    foreach ($flds as $index => $f)
    {
      $f->Select();
      $key = $mapping[$index];
      $value = $inputs[$key];
      if ($key == 'gender')
      {
        if ($value == 'm')
          $value = 'Mr.';
        else
          $value = 'Ms.';
      }
       
      if($key=='printdate')
        $value= date ('Y-m-d H:i:s');
     
      $w->Selection->TypeText($value);
      echo "<li>Mappig field $index: $key with value $value</li>";
    }
    echo "</ul>";
     
    echo "Mapping done!<br><hr>";
    echo "Printing. Please wait...<br>";
     
    $d->PrintOut();
    sleep(3);
    echo "Done!";
     
    $w->Quit(false);
    $w=null;
     
     
     
    function setupfields()
    {
      $mapping = array();
      $mapping[0] = 'gender';
      $mapping[1] = 'name';
      $mapping[2] = 'age';
      $mapping[3] = 'msg';
      $mapping[4] = 'printdate';
       
     
      return $mapping;
    }
    

    在設置完用來獲取表單中傳過來的值的變量$inputs之后,我們要創建一個虛擬值用來存放printdate——我們稍后會討論為何需要這個變量——現在,我們看到這4行比較關鍵的代碼:
     

    $assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
    $class = 'Microsoft.Office.Interop.Word.ApplicationClass';
     
    $w = new DOTNET($assembly, $class);
    $w->visible = true;
    

    在PHP中的COM操縱需要在一個assembly里請求一個class的實例。在我們的案例中,我見將要操作Word。如果考慮到我們上一個截圖中展示的代碼,我們將能夠構造出一個完整簽名的Word PIA:

    •     “Name”,“Version”,“Public Key Token”是在當我們瀏覽“c:\Windows\assembly”時所展示的信息
    •     “Cultrue”總是neutrual的。


    調用類編譯后的文件后綴名為通常為ApplicationClass.

    通過設置下面兩個步驟,我們可以初始化一個word對象:

    首先,word對象可以保存在后臺或者通過將visible屬性設置為true,使它在前臺展示出來。

    然后,我們打開將要處理的文檔,把它實例化為一個$d變量。

    在文檔對象中,基于html表單的文本來添加文檔的內容,這里可以設置一些參數。
    最不好的方式是對php頁面上所有內容進行硬編碼,然后將它們添加到word對象中。我強烈建議不采用此種方式,原因有:

    1 代碼沒有靈活性,php內容的任何變化都需要重新修改腳本;
    2 違反了控制層、展示層的分離;
    3  如果需要設置word內容的格式(對齊,字體,樣式,等),這種方式大大增加了代碼行數,并且以編程的方式來修改樣式是非常麻煩的。


    另一種方式是使用“搜索-替換”。PHP內置的這種功能非常強大。我們可以創建一個word文檔,在那些需要被替換的占位內容周圍放置一些分隔符。比如,我們創建一個文檔包含如下內容:

    {{name}}
    
    

    在PHP中,我們只需使用從表單提交中獲取的“Name”值來替換。這種方式避免了第一選項中的那些缺點。我們只需要找到正確的分隔符,在這個例子中,除了使用的模板是word文檔,我們更像是做一個模板渲染。


    第三個選項是我的建議,并是Word中的高級主題。我們將用域來表示占位符,在我們的PHP代碼中,我們會直接更新了相應的表單值的字段。 

    這種方法靈活,快速,符合Word的最佳實踐。這也避免了文件的全文搜索,這有助于提高性能。請注意,此選項有它的缺點了。 

    總之,自從首次亮相,Word從來沒有支持命名索引的字段。盡管我們對于我們在Word文檔中創建的字段提供了一個名字,我們還是要用數字下標來訪問每個字段。這也解釋了為什么我們要使用專用的功能(setupfields)做表單字段的字段索引和名之間的映射手冊


    學習如何在word文檔中插入字段(點擊這里查看一個定制好的版本),請參閱相關 Word 幫助主題和手冊。對于這個demo,我們有一個具備5個MERGEFIELD字段的文檔。此外,我們將文檔和PHP腳本放在一個目錄下,以方便獲取。

    請注意,printdate字段并沒有一個相應的窗體字段。這就是為什么我們要在$inputs數組中添加一個假的printdate作為key。沒有這個key,腳本依然可以執行,但是會有提示說明$inputs數組中不存在索引printdate。

    在使用表單數據更新完字段的值之后,我們將會使用下面的命令打印文檔:
     

    $d->PrintOut();
    

    PrintOut方法有幾個可選參數,這里,我們使用最簡單的格式。這將會給鏈接到我們Windows機器的默認打印機打印一份副本。


    我們可以通過使用PrintPreview進行打印預覽。在純自動化的情景下,當然,我們直接使用PrintOut進行打印。

    在退出word應用程序之前,我們還需要稍作等待,因為打印工作需要時間來完全退出后臺。如果沒有delay(3),$w->Quit將會立刻得到執行,并且打印工作立刻被終止。

    最終,我們調用 $w->Quit(false) 來選擇通過我們的PHP腳本調用關閉word應用程序。這里提供的唯一參數是用來指明我們是否希望在退出前保存更改。我們確實對文檔進行了更改,但是我們不希望保存它們,因為我們希望能為其他用戶的輸入提供一份干凈的模板。
     

    當我們完成編碼之后,我們可以加載表單頁面,輸入一些內容并提交表單。下面的截圖展示了PHP腳本的輸出,同時更新了Word文檔:

    201573144442664.png (889×757)

    201573144502426.png (1663×843)

    提高編碼速度并更好的理解PIA

    PHP是一種弱類型的語言。一個COM對象是一種Object類型。在我們的PHP編碼過程中,在一個對象中我們無法使用代碼自動提示和完成功能,在一個Word應用,一個文檔甚至一個字段中同樣如此。我們不知道它有哪些特性,或者它支持哪些方法。


    這將大幅度的降低我們開發的速度。為了使開發更快,首先,我建議我們在c#中開發功能應當遷移至我們的PHP編碼。我推薦一款免費的C# IDE 叫做"#develop",你可以在這里下載。相比VS,我更喜歡這一款軟件,因為#develop體積更小,更簡潔,響應更快。

    C#代碼遷移至PHP一點也不嚇人。先讓我展示一些C#的代碼:
     代碼 代碼如下: Word.Application w=new Word.Application();
    w.Visible=true;
                
    String path=Application.StartupPath+"\\template.docx";
                
    Word.Document d=w.Documents.Open(path) as Word.Document;
                
    Word.Fields flds=d.Fields;
    int len=flds.Count;
                
    foreach (Word.Field f in flds)
    {
        f.Select();
        int i=f.Index;
        w.Selection.TypeText("...");
    }

    我們可以看到,C#的代碼和我們之前展示的PHP的代碼基礎一模一樣。由于C#是一種強類型語言,所以我們可以看到有些類型轉換的語句,我們不得不顯性的給我們的變量賦一種類型。

    有了代碼的類型,我們可以盡情的享受代碼的自動提示和代碼自動完成功能,這樣我們開發的速度將有大幅度提高。


    另一種可以給予我們更快速度進行PHP開發的方式是使用Word的宏命令。我們先操作一遍我們需要重復的動作,然后用一個宏將其錄制下來。一個宏其實是Visual Basic,同樣也可以非常容易的翻譯成PHP。

    最重要的是,Office PIA微軟官方文檔,特別是文檔中對于每個Office應用的命名空間,總會是我們所需要的最想進的參考。比較常用的3個應用如下:

    •     Excel 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx
    •     Word 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
    •     PowerPoint2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

    結語

    在這篇文章中,我們演示了如何使用PHP COM庫和Microsoft Office Interop功能來倩影一個Word文檔。

    Windows和Office在我們的日常生活中可以說是被廣泛的使用。能夠知道和了解Office或者Windows的強大之處還有PHP,對于任何一個在Windows平臺上進行PHP開發的程序員都是十分必要的。

    使用PHP的COM擴展,掌握這一組合的大門就被打開了。

    如果你對于這部分的編程比較感興趣,請留下你的評論,我們將會考慮在這個話題上寫更多的文章。我十分期待更多現實生活的應用開發能使用這種方式。

    1
    贊一個
    關鍵詞:
    ☆喜歡這篇文章嗎?分享給你的好友吧!點擊這里復制網址☆
    共有110人閱讀,期待你的評論!評論
    請先登陸后才能發表評論哦!沒賬號?趕緊注冊一個吧!
    最新評論
    熱門標簽
    回到頂部