使用PHPWord生成合同什么的很方便,也很簡單,就是在doc模板文件中提前設置好變量名稱,如${name},然后替換成真實內容就行,包括word中動態表格(行數不定)的處理也非常簡單。
加載模板文件
1
2
|
$path
=
"tpl.doc"
;
//指明你的word模板地址
$phpWordProcessor
=
new
TemplateProcessor(
$path
);
//加載模板文件
|
替換模板中內容
word中動態內容使用${varName}標記,然后替換成實際內容即可
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中處理這種問題非常方便。
首先我們創建表格模板,只需要創建一行就行,然后我們在代碼中根據實際情況進行復制,有多少行就復制多少行
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'
,
'成功后付款'
);
|
復制之后的表格模板,實際自動變成了如下樣子
替換復雜表格內容
如表格形式是這樣的,我們要動態添加多行
也很簡單
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