Xử lý tài liệu với thư viện PhpWord

PHPOffice là một thư viện PHP khá mạnh để thực hiện các công việc liên quan đến các file văn bản và trang tính. Nó bao gồm 2 công cụ: PHPWord để thao tác với file văn bản và PHPExcel để thao tác với trang tính. Với 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,...

Sau đây là hướng dẫn tích hợp thư viện PHPWord vào CodeIgniter:

Bước 1: Download PHPWord từ github:

https://github.com/PHPOffice/PHPWord

Bước 2: Giải nén PHPWord (chỉ giải nén PHPWord.php and PHPWord folder) và đưa vào thư mục application/third_party của CodeIgniter

Chỉ copy 2 thư mục vào application/third_party

Bước 3: tạo 1 thư viện mới trong application/libraries của CodeIgniter. Ví dụ đặt tên là Word.php với mã nguồn như sau:
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed'); 
require_once APPPATH."/third_party/PHPWord.php"; 
 
class Word extends PHPWord { 
    public function __construct() { 
        parent::__construct(); 
    } 
}
Bước 4: gọi và sử dụng thư viện Word từ Controller:

Gọi thư viện và tạo ra section mới (Bắt buộc)

$this->load->library('word');
//our docx will have 'lanscape' paper orientation
$section = $this->word->createSection(['orientation' => 'landscape']);

Thêm một số định dạng và đoạn văn bản.

// Add text elements
$section->addText('Hello World!');
$section->addTextBreak(1);
  
$section->addText('I am inline styled.', ['name' => 'Verdana', 'color' => '006699']);
$section->addTextBreak(1);
  
$this->word->addFontStyle('rStyle', ['bold' => true, 'italic' => true, 'size' => 16]);
$this->word->addParagraphStyle('pStyle', ['align' => 'center', 'spaceAfter' => 100]);
$section->addText('I am styled by two style definitions.', 'rStyle', 'pStyle');
$section->addText('I have only a paragraph style definition.', null, 'pStyle');

Thêm một số ảnh. Chú ý không sử dụng base_url or site_url, PHPWord chỉ sử dụng đường dẫn tuyêt đối đến máy chủ của bạn. Có nghĩa rằng bạn không thể thêm ảnh mà không phải từ máy chủ của bạn.

// Add image elements
$section->addImage(FCPATH.'/image/_mars.jpg');
$section->addTextBreak(1);
$section->addImage(FCPATH.'/image/_earth.JPG', ['width' => 210, 'height' => 210, 'align' => 'center']);
$section->addTextBreak(1);
$section->addImage(FCPATH.'/image/_mars.jpg', ['width' => 100, 'height' => 100, 'align' => 'right']);

Tạo bảng table và đưa thêm 1 số định dạng style

// Define table style arrays
$styleTable = ['borderSize' => 6, 'borderColor' => '006699', 'cellMargin' => 80];
$styleFirstRow = ['borderBottomSize' => 18, 'borderBottomColor' => '0000FF', 'bgColor' => '66BBFF'];
// Define cell style arrays
$styleCell = ['valign' => 'center'];
$styleCellBTLR = ['valign' => 'center', 'textDirection' => PHPWord_Style_Cell::TEXT_DIR_BTLR];
// Define font style for first row
$fontStyle = ['bold' => true, 'align' => 'center'];
// Add table style
$this->word->addTableStyle('myOwnTableStyle', $styleTable, $styleFirstRow);
// Add table
$table = $section->addTable('myOwnTableStyle');
// Add row
$table->addRow(900);
// Add cells
$table->addCell(2000, $styleCell)->addText('Row 1', $fontStyle);
$table->addCell(2000, $styleCell)->addText('Row 2', $fontStyle);
$table->addCell(2000, $styleCell)->addText('Row 3', $fontStyle);
$table->addCell(2000, $styleCell)->addText('Row 4', $fontStyle);
$table->addCell(500, $styleCellBTLR)->addText('Row 5', $fontStyle);
// Add more rows / cells
for ($i = 1; $i <= 2; $i++) {
    $table->addRow();
    $table->addCell(2000)->addText("Cell $i");
    $table->addCell(2000)->addText("Cell $i");
    $table->addCell(2000)->addText("Cell $i");
    $table->addCell(2000)->addText("Cell $i");
    $text = $i % 2 == 0 ? 'X' : '';
    $table->addCell(500)->addText($text);
}

Cuối cùng đặt tên văn bản với đuôi .docx và lưu file lại.

$filename='just_some_random_name.docx'; //save our document as this file name
header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); //mime type
header('Content-Disposition: attachment;filename="'.$filename.'"'); //tell browser what's the file name
header('Cache-Control: max-age=0'); //no cache
 
$objWriter = PHPWord_IOFactory::createWriter($this->word, 'Word2007');
$objWriter->save('php://output');