Để tạo một tài liệu Word thì hiện tại không có nhiều thư viện PHP để làm tốt công việc này. Trong bài viết này sẽ giới thiệu về thư viện PhpWord để xuất ra các định dạng Word. PHPWord ta có thể dễ dàng tạo ra một file văn bản mới với các thành phần và định dạng như mong muốn, hoặc ta cũng có thể tạo ra một file văn bản từ một template đã có sẵn. PHPWord cung cấp các phương thức để người dùng dễ dàng tạo một file văn bản với các thành phần cơ bản như text, paragraph, header, footer, table
1. Các tính năng
- Đặt tiêu đề, chủ đề và người tạo
- Tùy biến kích thước và đánh số trang
- Tạo header và footer cho mỗi trang văn bản
- Đặt loại phông chữ mặc định, kích thước phông chữ
- Sử dụng phông UTF-8 và East Asia
- Tùy chỉnh kiểu phông chữ như in đậm, in nghiêng, khoảng cách …
- Chèn các đoạn văn bản đơn giản hoặc phức tạp
- Chèn tiêu đề, mục lục
- Ngắt văn bản hoặc ngắt trang
- …
2. Cài đặt
Sử dụng composer
1 2 3 4 5 6 7 8 | <span class="token punctuation">{</span> <span class="token property">"require"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"phpoffice/phpword"</span><span class="token operator">:</span> <span class="token string">"v0.17.*"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> # run<span class="token operator">:</span> composer install |
Sau khi cài đặt xong thì ta có thể sử dụng bằng ví dụ tạo file word sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Services</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">PhpOffice<span class="token punctuation"></span>PhpWord<span class="token punctuation"></span>PhpWord</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">PhpOffice<span class="token punctuation"></span>PhpWord<span class="token punctuation"></span>IOFactory</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">PhpWordService</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">createFileWord</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Khởi tạo đối tượng phpWord</span> <span class="token variable">$phpWord</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PhpWord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Thêm một tài liệu Word</span> <span class="token variable">$section</span> <span class="token operator">=</span> <span class="token variable">$phpWord</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">addSection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Thêm nội dung tài liệu cũng như các định dạng cơ bản của tài liệu</span> <span class="token variable">$section</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">addText</span><span class="token punctuation">(</span> <span class="token single-quoted-string string">'Nội dung'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token single-quoted-string string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Arial'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'size'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">14</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Khởi tạo đối tượng writer</span> <span class="token variable">$writer</span> <span class="token operator">=</span> IOFactory<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">createWriter</span><span class="token punctuation">(</span><span class="token variable">$phpWord</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Word2007'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Tạo tập tin Word</span> <span class="token variable">$writer</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">save</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'path/to/save/filename.docx'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
Tạo file từ một mẫu cho trước
Với PhpWord ta có thể tạo một file từ một mẫu cho trước bằng cách đặt các ${key_search} ở các vị trí trong văn bản mẫu, các vị trí này sẽ được thay thế bằng bất cứ giá trị nào mà ta muốn điền.
Để tải một file word mẫu ta dùng
1 2 | <span class="token variable">$templateProcessor</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplateProcessor</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Template.docx'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
setValue
Trong file template ta tạo các ${firstname} và ${lastname} vào các vị trí cần điền các nội dung tương ứng
Hello ${firstname} ${lastname}!
khi này ta chỉ cần thêm bất cứ nội dung cần thiết bằng cách sử dụng hàm setValue
1 2 3 | $templateProcessor->setValue('firstname', 'John'); $templateProcessor->setValue('lastname', 'Doe'); |
kết quả thu được sẽ là Hello John Doe!
setValues
Ngoài cách sử dụng nhiều hàm setValue
thì ta có thể truyền 1 mảng nhiều phần tử vào hàm setValues
1 2 3 4 5 6 7 8 | <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">setValues</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'firstname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'John'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'lastname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Doe'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> |
setImageValue
Ta có thể chèn hình ảnh vào văn bản mẫu bằng nhiều cách như sau
${search-image-pattern}
${search-image-pattern:[width]:[height]:[ratio]}
${search-image-pattern:[width]x[height]}
${search-image-pattern:size=[width]x[height]}
${search-image-pattern:width=[width]:height=[height]:ratio=false}
Ví dụ
1 2 3 | ${CompanyLogo} ${UserLogo:50:50} ${Name} - ${City} - ${Street} |
1 2 3 4 5 6 7 | <span class="token variable">$templateProcessor</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplateProcessor</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Template.docx'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Name'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'John Doe'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'City'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Street'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Detroit'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'12th Street'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">setImageValue</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'CompanyLogo'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'path/to/company/logo.png'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">setImageValue</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'UserLogo'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'path'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'path/to/logo.png'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'width'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'height'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'ratio'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
cloneBlock
1 2 3 4 5 | ${block_name} Customer: ${customer_name} Address: ${customer_address} ${/block_name} |
Nội dung ở giữa ${block_name} và ${/block_name} sẽ được lặp lại 3 lần khi ta sử dụng:
1 2 | <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">cloneBlock</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'block_name'</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Kết quả trả về sẽ là
1 2 3 4 5 6 7 8 9 | Customer: ${customer_name#1} Address: ${customer_address#1} Customer: ${customer_name#2} Address: ${customer_address#2} Customer: ${customer_name#3} Address: ${customer_address#3} |
ta cũng có thể truyền một mảng nhiều phần tử:
1 2 3 4 5 6 | <span class="token variable">$replacements</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'customer_name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Batman'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'customer_address'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Gotham City'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'customer_name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Superman'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'customer_address'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Metropolis'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">cloneBlock</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'block_name'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token variable">$replacements</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
kết quả
1 2 3 4 5 6 | Customer: Batman Address: Gotham City Customer: Superman Address: Metropolis |
replaceBlock
ta dùng hàm này để sửa 1 nội dung nào đó trong file mẫu
1 2 3 4 | ${block_name} This block content will be replaced ${/block_name} |
1 2 | <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">replaceBlock</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'block_name'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'This is the replacement text.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
deleteBlock
Xóa một khối nội dung trong văn bản mẫu
1 2 | <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">deleteBlock</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'block_name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
cloneRow
Hàm này khá tiện khi trong văn bản mẫu có những nội dung dạng bảng:
1 2 3 4 5 6 | +-----------+----------------+ | ${userId} | ${userName} | | |----------------+ | | ${userAddress} | +-----------+----------------+ |
1 2 | <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">cloneRow</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'userId'</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Sẽ cho kết quả
1 2 3 4 5 6 7 8 9 10 | +-------------+------------------+ | ${userId#1} | ${userName#1} | | |------------------+ | | ${userAddress#1} | +-------------+------------------+ | ${userId#2} | ${userName#2} | | |------------------+ | | ${userAddress#2} | +-------------+------------------+ |
cloneRowAndSetValues
cũng như hàm cloneRow tuy nhiên hàm cloneRowAndSetValues có vẻ hữu dụng hơn trong nhiều trường hợp dữ liệu truyền vào là dạng mảng:
1 2 3 4 5 6 | +-----------+----------------+ | ${userId} | ${userName} | | |----------------+ | | ${userAddress} | +-----------+----------------+ |
1 2 3 4 5 6 | <span class="token variable">$values</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'userId'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'userName'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Batman'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'userAddress'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Gotham City'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'userId'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'userName'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Superman'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'userAddress'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Metropolis'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$templateProcessor</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">cloneRowAndSetValues</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'userId'</span><span class="token punctuation">,</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> |
Kết quả sẽ là
1 2 3 4 5 6 7 8 9 10 | +---+-------------+ | 1 | Batman | | |-------------+ | | Gotham City | +---+-------------+ | 2 | Superman | | |-------------+ | | Metropolis | +---+-------------+ |
Lưu ý: Trong quá trình làm việc với file word có thể là do vô tình hoặc cố ý ta phải xuống dòng ở 1 số nội dung nào đó. Thì ta dùng </w:t><w:br/><w:t>
không nên dùng n
, <br />
Kết Luận
Ở bài viết này đã giới thiệu những khái niệm cũng như tính năng của thư viên PHPWord. Còn cách dùng thì tập chung vào phần sử dung PHPWord để tạo file từ một file mẫu có sẵn. Chúc thành công!