智能云排名SEO内测

百度关键词优化三天上首页!同行都是朋友, 欢迎一起互利共赢。谢绝一切非正规行业服务,感谢以下同行、团队、平台和代理的支持:

百度站長平台、MIP開發小組、SEO焦大老友、SEO每天一貼ZAC大哥、盧松松大哥、海瑤SEO兄弟、附子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人閱讀,期待你的評論!評論
請先登陸后才能发表評論哦!没账号?赶紧注冊一個吧!
最新評論
熱門標簽
回到頂部