PHPWord api使用方法整理,加載模板文件,替換模板內容,動態表格生成,表格行數不定處理方式,復制表格,循環表格


使用PHPWord生成合同什么的很方便,也很簡單,就是在doc模板文件中提前設置好變量名稱,如${name},然后替換成真實內容就行,包括word中動態表格(行數不定)的處理也非常簡單。

加載模板文件

1
2
$path = "tpl.doc" ;   //指明你的word模板地址
$phpWordProcessor  new  TemplateProcessor( $path );  //加載模板文件

 

替換模板中內容

word中動態內容使用${varName}標記,然后替換成實際內容即可

WX20190718-111533@2x.png

1
2
3
4
$phpWordProcessor ->setValue( 'company' , "北京3W測試公司" );
$phpWordProcessor ->setValue( 'company_address' , "北京市海淀區中關村創業大街" );
$phpWordProcessor ->setValue( 'company_mobile' , "15600059668" );
$phpWordProcessor ->setValue( 'company_name' , "李德龍" );

替換動態表格內容

實際開發中遇到一個問題就是,合同中有個表格,但是表格有多少行數據是動態的,有幾行數據就顯示幾行,不能多。最初想的辦法是建立多個模板文件,比如20個doc文件,第一個文件中只設置2行,第二個文件只設置2行,實際數據有幾行,我就調用第幾個文件....這是一個笨辦法,好在臨時解決了問題,但是非常的2,PHPWord中處理這種問題非常方便。

首先我們創建表格模板,只需要創建一行就行,然后我們在代碼中根據實際情況進行復制,有多少行就復制多少行

WX20190718-111911@2x.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$phpWordProcessor ->cloneRow( 'index' ,3);    //找到要復制的地方,隨便復制其中的1個變量名即可
 
//依次替換其中的內容,第一行就是 原變量名#1,第二行就是  原變量名#2 ,以此類推
$phpWordProcessor ->setValue( 'index#1' '1' );
$phpWordProcessor ->setValue( 'type#1' '資金補貼' );
$phpWordProcessor ->setValue( 'service_title#1' '中關村小微補貼' );
$phpWordProcessor ->setValue( 'service_scale#1' '20%' );
$phpWordProcessor ->setValue( 'service_cash#1' '成功后付款' );
 
$phpWordProcessor ->setValue( 'index#2' '2' );
$phpWordProcessor ->setValue( 'type#2' '資金補貼' );
$phpWordProcessor ->setValue( 'service_title#2' '研發補貼' );
$phpWordProcessor ->setValue( 'service_scale#2' '20%' );
$phpWordProcessor ->setValue( 'service_cash#2' '成功后付款' );
 
$phpWordProcessor ->setValue( 'index#3' '3' );
$phpWordProcessor ->setValue( 'type#3' '資金補貼' );
$phpWordProcessor ->setValue( 'service_title#3' '海淀補貼' );
$phpWordProcessor ->setValue( 'service_scale#3' '20%' );
$phpWordProcessor ->setValue( 'service_cash#3' '成功后付款' );

復制之后的表格模板,實際自動變成了如下樣子

WX20190718-112324@2x.png

替換復雜表格內容

如表格形式是這樣的,我們要動態添加多行

WX20190718-112504@2x.png

也很簡單

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$values  array (    
     array (    
         'userId'         => 1,    
         'userFirstName'  =>  'James' ,    
         'userName'       =>  'Taylor' ,    
         'userPhone'      =>  '+1 428 889 773' ,    
     ),    
     array (    
         'userId'         => 2,    
         'userFirstName'  =>  'Robert' ,    
         'userName'       =>  'Bell' ,    
         'userPhone'      =>  '+1 428 889 774' ,    
     ),    
     array (    
         'userId'         => 3,    
         'userFirstName'  =>  'Michael' ,    
         'userName'       =>  'Ray' ,    
         'userPhone'      =>  '+1 428 889 775' ,    
     ),    
);    
$phpWordProcessor ->cloneRowAndSetValues( 'userId' $values );

也可以一行一行的設置值

1
2
3
4
5
6
7
8
9
10
11
12
13
$phpWordProcessor ->cloneRow( 'userId' , 3);
$phpWordProcessor ->setValue( 'userId#1' '1' );
$phpWordProcessor ->setValue( 'userFirstName#1' 'James' );
$phpWordProcessor ->setValue( 'userName#1' 'Taylor' );
$phpWordProcessor ->setValue( 'userPhone#1' '+1 428 889 773' );
$phpWordProcessor ->setValue( 'userId#2' '2' );
$phpWordProcessor ->setValue( 'userFirstName#2' 'Robert' );
$phpWordProcessor ->setValue( 'userName#2' 'Bell' );
$phpWordProcessor ->setValue( 'userPhone#2' '+1 428 889 774' );
$phpWordProcessor ->setValue( 'userId#3' '3' );
$phpWordProcessor ->setValue( 'userFirstName#3' 'Michael' );
$phpWordProcessor ->setValue( 'userName#3' 'Ray' );
$phpWordProcessor ->setValue( 'userPhone#3' '+1 428 889 775' );

不得不贊嘆一聲,真是強大

復制塊內容或刪除塊內容

如果我們在模板中有一塊內容,可能展示也可能不展示,則可通過復制或刪除塊進行處理。

現在word模板中添加一個塊,塊格式形如 ${block_name}塊內容${/block_name}

1
2
3
4
5
word模板中添加這么一個塊,塊的名字自定義
 
${block}
此處內容是否展示,可以控制
${/block}

在代碼中可通過cloneBlock來復制塊,復制1份,就相當於顯示此塊內容了, 當然也可以復制多份;也可以通過deleteBlock來刪除塊

1
2
3
4
5
$phpWordProcessor ->cloneBlock( 'block' , 1);   //顯示模板中的塊
 
$phpWordProcessor ->cloneBlock( 'block' , 3);   //復制多份
 
$phpWordProcessor ->deleteBlock( 'block' );   //刪除塊

 

復制塊或刪除塊無效

如果已經按照上述方法進行復制塊操作,但是死活就是不成功的時候,可能是因為文檔內容太多,導致cloneBlock內部的preg_match方法中的字符串過長。

原因是php在進行正則匹配的時候,有個遞歸次數限制pcre.recursion_limit,無限次的遞歸容易消耗所有進程的可用堆棧,最后導致PHP崩潰。所以默認“pcre.backtrack_limit ”的值默認只設了100000。當我們word中內容過大時候,就導致超出這個遞歸次數限制,導致匹配出無結果,也就沒有辦法實現復制塊的操作。

解決辦法:修改“pcre.backtrack_limit ”的值默認,在代碼前面加一句,搞定! 

1
ini_set ( 'pcre.backtrack_limit' , 999999999);

 

下載word文件

1
2
3
4
5
6
$filename  = iconv( "utf-8" , "gb2312" , "測試" );    //防止有的瀏覽器下載之后中文亂碼
 
header( "Content-type: application/vnd.ms-word" );
header( "Content-Disposition:attachment;filename=" . $filename . ".docx" );
header( 'Cache-Control: max-age=0' );
$phpWordProcessor ->saveAs( "php://output" );

原文轉載自:http://shanhuxueyuan.com/news/detail/124.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM