12/08/2018, 10:14

[CakePHP] Xuất dữ liệu ra Excel sử dụng thư viện PHPExcel

Trong các ứng dụng web hẳn các bạn đã gặp hoặc từng phát triển chức năng cho phép người dùng xuất dữ liệu ra file dưới dạng Excel. Với ứng dụng sử dụng CakePHP nói riêng hay PHP nói chung thì bạn sẽ có hẳn một thư viện đồ sộ hỗ trợ - đó chính là PHPExcel. Bài này tôi sẽ thiệu về nó, cách tích hợp ...

Trong các ứng dụng web hẳn các bạn đã gặp hoặc từng phát triển chức năng cho phép người dùng xuất dữ liệu ra file dưới dạng Excel. Với ứng dụng sử dụng CakePHP nói riêng hay PHP nói chung thì bạn sẽ có hẳn một thư viện đồ sộ hỗ trợ - đó chính là PHPExcel. Bài này tôi sẽ thiệu về nó, cách tích hợp vào CakePHP và cách sử dụng cơ bản với một demo nhỏ.

Thư viện PHPExcel đòi hỏi môi trường của bạn phải có những thiết lập như sau :

  • Phiên bản PHP sử dụng bằng hoặc cao hơn 5.2.0
  • Gói php_zip phải enabled lên nếu bạn muốn xuất Excel 2007
  • Gói php_xml enabled
  • Nếu gói php_gd2 không được compile cùng PHP thì cũng cần enabled

Hiện bản stable mới nhất của PHPExcel là 1.8.0, các bạn hãy download về theo đường link này. Sau khi download xong, hãy giải nén và copy thư mục và file có trong thư mục PHPExcel_1.8.0_doc/Classes/ vào thư mục app/Vendor/

Tiếp theo, bạn hãy tạo một file mới trong app/View/Helper với tên PhpExcelHelper.php, nội dung file này bạn hãy copy từ file có tên tương ứng ở link này của tác giả segy trên github. Nhưng bạn sẽ gặp lỗi not found nếu không sửa dòng 41 và 54 trong file đó thành như dưới đây :

App::import('Vendor', 'PHPExcel');

Việc tích hợp với CakePHP đã hoàn thành với vài bước rất đơn giản như trên, giờ hãy tạo một demo nho nhỏ.

Chuẩn bị

Tôi sẽ dựng một demo với nội dung đơn giản là một hệ thống bán hàng online rút gọn với chỉ 2 chức năng chính : list các invoice ra với các thông tin về khách hàng và ngày order (index.ctp), tiếp đến là khi vào chi tiết sẽ có chức năng xuất invoice ra dưới dạng file Excel (view_invoice_detail.ctp). Lần lượt các view này được gọi từ 2 phương thức index()viewInvoiceDetail($$nvoiceId) có trong Controller tương ứng, code và giải thích cho phần này các bạn có thể xem chi tiết trong InvoicesController.php. Phần DB các bạn hãy xem script tạo có trong readme.md trên github. Về phần app/Model, có các file model tương ứng định nghĩa mối quan hệ giữa các bảng sử dụng kiến thức tôi đã có post ở bài này, các bạn có thể tham khảo nếu chưa hiểu về Linking model.

Sau khi chuẩn bị và chạy thử với các phần trên, bạn sẽ có kết quả tương tự như 2 hình sau :

Invoice list

t1.png

Invoice detail

t2.png

Demo

Tạo và xuất Excel

Với Helper của segy, bạn cần khai báo sử dụng nó trong Controller

var $helpers = array('PhpExcel');

Tiếp theo là cần phương thức để lấy dữ liệu cần thiết xuất ra Excel

	public function exportToExcel($invoiceId) {
    	// phần code bạn hãy xem trong source, nội dung giống với viewInvoiceDetail()
	}

Giờ bạn đã có nhưng cái cần thiết, tiếp theo là tạo ra một file (worksheet) để thao tác với nó, bạn code như sau trong view tương ứng :

$this->PhpExcel->createWorksheet();

Đây là cách tạo mới, ngoài ra bạn còn có thể load lên một file sẵn có để làm việc với nó nhưng bài này tôi sẽ không đề cập đến.

Để kết thúc một phiên làm việc với file đó, bạn có thể output nó ra browser cho end user hoặc save nó xuống local server. Ở đây, tôi sẽ đưa file ra browser :

$this->PhpExcel->output('invoice.xlsx');

Cuối cùng, bạn hãy giải phóng bộ nhớ được dùng bởi PHPExcel bằng dòng sau :

$this->PhpExcel->freeMemory();

Tạo nội dung Excel

Nếu bạn chạy chương trình thì sẽ thấy được file Excel nhưng nội dung vẫn chưa có, đương nhiên ! bởi ta chưa làm gì cả             </div>
            
            <div class=

0