Hướng dẫn phpexcel border - biên giới phpexcel

I use the below code for All Borders

$BStyle = array(
  'borders' => array(
    'allborders' => array(
      'style' => PHPExcel_Style_Border::BORDER_THIN
    )
  )
);

Here i use

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);

But How can i give the Outside Border Like the below given screen

Hướng dẫn phpexcel border - biên giới phpexcel

asked Jan 4, 2015 at 9:36Jan 4, 2015 at 9:36

As described in the PHPExcel docs you use

$BStyle = array(
  'borders' => array(
    'outline' => array(
      'style' => PHPExcel_Style_Border::BORDER_THIN
    )
  )
);
0, so:

$BStyle = array(
  'borders' => array(
    'outline' => array(
      'style' => PHPExcel_Style_Border::BORDER_THIN
    )
  )
);

All the available options are shown in this illustration

Hướng dẫn phpexcel border - biên giới phpexcel

answered Jan 4, 2015 at 9:46Jan 4, 2015 at 9:46

Hướng dẫn phpexcel border - biên giới phpexcel

Mark BakerMark BakerMark Baker

207k31 gold badges339 silver badges381 bronze badges31 gold badges339 silver badges381 bronze badges

2

Ở phần 1 tôi đã trình bày sơ qua về cách tích hợp PHPExcel vào CakePHP. Bài này tôi xin chia sẻ thêm một vài tính năng khác như cách thiết lập width, height của dòng cột, cố định vị trí dòng cột, hay style cho cell dữ liệu để nội dung được thân thiện hơn, hay phục vụ cho việc in ấn file.

Width & Height

Việc thiết lập độ rộng cột hay chiều cao hàng thực hiện rất đơn giản, chỉ việc gọi đến các hàm tương ứng rồi cho đối số vào là hoàn thành, đó chính là setWidth() và setRowHeight(), cách dùng như đoạn code này ví dụ bạn chắc chắn ko có sản phẩm nào có giá từ chục triệu trở lên thì tối đa số các con số là 7, vậy hãy set là 10 cho rộng rãi cửa nhà :

/*
 * now i will set width for Price column to 10 (can fill 8 number characters) * or you can set auto width for it by using setAutoSize(true)
*/
$this->PhpExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10);

Vậy còn height? trong demo này có thể lấy minh hoạ rằng dòng trống sau bảng dữ liệu phải rộng hơn để cho nhìn cảm giác thoải mái hơn chút :

// set that blank row's height to 30pt by using setRowHeight()
$this->PhpExcel->getActiveSheet()->getRowDimension($next2Row - 1)->setRowHeight(25);

Style

Căn lề dữ liệu

Đầu tiên là header của bảng dữ liệu, tôi sẽ thiết lập để nó được căn lề giữa cho cả 2 chiều ngang (dùng setHorizontal) và dọc (dùng setVertical). Nhưng trước đó, phải cần xem là căn cho cell nào hay là một dải các cell, vùng các cell bằng getStyle(), rồi sẽ getAlignment() để cho PHPExcel biết ta sẽ style về lề dữ liệu :

// then align heading to center
$this->PhpExcel->getActiveSheet()->getStyle('A7:F7')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$this->PhpExcel->getActiveSheet()->getStyle('A7:F7')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

Như bạn thấy chỉ cần truyền hằng số về căn lề đã đươc định sẵn thì cell đã được style lề, ngoài căn giữa thì còn có thể chọn right hay left theo đúng cú pháp trên.

Tiếp theo là style cho bảng dữ liệu sau header, trong demo này thì ta biết chắc dữ liệu sẽ được fill vào từ dòng 8 còn dòng cuối của bảng có thể lấy qua biến $next2Row trừ đi 2 sẽ ra kết quả. Hai cột đầu tiên là số thứ tự (No) và mã sản phẩm (Code) sẽ canh giữa theo cả 2 chiều :

// ok, we have $next2Row so we know current row.
// we will style from row 8 for cell table
// firstly, column A (No) will be centered
$this->PhpExcel->getActiveSheet()->getStyle('A8:A' . (string)($next2Row - 2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$this->PhpExcel->getActiveSheet()->getStyle('A8:A' . (string)($next2Row - 2))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

Mặc định cột Product được căn lề trái nên nếu cần thiết thì chỉ set lề chiều dọc nữa mà thôi

$this->PhpExcel->getActiveSheet()->getStyle('C8:C' . (string)($next2Row - 2))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

Cuối cùng là 3 cột cuối Price, Quantity và Sub Total đều chứa dữ liệu kiểu số nên ta sẽ để căn lề phải chiều ngang và căn giữa chiều dọc :

$this->PhpExcel->getActiveSheet()->getStyle('D8:F' . (string)($next2Row - 2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$this->PhpExcel->getActiveSheet()->getStyle('D8:F' . (string)($next2Row - 2))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

Bạn hẳn nhận thấy rằng đang thừa code một chút, bởi vì dải A8:F(cuối) đều căn lề giữa chiều dọc nên cần thu gọn bớt như sau là đủ :

$this->PhpExcel->getActiveSheet()->getStyle('A8:F' . (string)($next2Row - 2))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
0

Border

Giờ đến lúc thiết lập các border cần thiết để khi in ra nhìn sẽ đẹp hơn, rõ ràng với khung viền bao quanh bảng dữ liệu. Để thiết lập thì bạn cần gọi getBorders() trước tiên, sau đó là border nào bạn định format (trái, phải, trên dưới hay tất cả) và cuối cùng sẽ là loại border nào bạn muốn. Các loại border được hỗ trợ rất nhiều, cơ bản có THIN, THICK, DOTTED, DASHED, DOUBLE, DASHDOT ...

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
1

Hyperlink

Trong demo này chỗ thích hợp để link nhất chắc là tên khách hàng, chẳng hạn gắn vào đó email của khách hàng và khi click vào đó sẽ khởi động trình soạn thảo mail gửi cho khách hàng. Hoặc là URL dẫn đến chính invoice đó trên giao diện web

Hướng dẫn phpexcel border - biên giới phpexcel

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
2

Cố định hàng cột khi view

Với những file có số lượng hàng cột nhiều mà không thể xem hết trong màn hình, đôi khi ta sẽ cần cố định những phần nội dung thường là tiêu đề để khi kéo view sang các hàng cột bị khuất thì sẽ vẫn biết được đang aview phần nội dung của tiêu đề nào. Ở demo này dữ liệu là không nhiều nhưng tôi sẽ cố định lại phần thông tin về khách hàng và cột A :

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
3

Hàm freezePane() làm việc giống như Excel của bạn, như trên khi chỉ định B6 làm đối số thì PHPExcel sẽ hiểu là bạn muốn cố định từ dòng 1 đến 5 và các cột trước B (tức cột A). Rất đơn giản phải không !?

Metadata

Mỗi file khi được xuất ra từ hệ thống, để đảm bảo tính sở hữu cá nhân hay bản quyền, hoặc để quản lý tìm kiếm file được dễ dàng hơn ... nhiều khi bạn cần đưa cả những thông tin cần thiết (như tên người tạo, subject của file, mô tả về file đó ...) vào metadata. PHPExcel hỗ trợ các thông tin như sau :

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
4

Comment và data validation

Comment

Với nhiều ứng dụng, đôi khi những nội dung trên file có chỗ sẽ cần phải note lại cho người đọc dễ hiểu hơn như chú thích về cách tính của một cell, hay bất kì nội dung chú thích nào khác thì giải pháp là để lại comment cho cell dữ liệu đó. PHPExcel hỗ trợ rất nhiều và chức năng này cũng không là ngoại lệ. Bạn sẽ dùng hàm getComment() với đối số là địa chỉ cell dữ liệu muốn để comment rồi dùng getText() và createTextRUn('content here') để fill nội dung comment vào cell đã định. Giả sử comment cell đầu tiên là phải thanh toán trước, hãy cùng xem đoạn code demo sau :

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
5

Data validation

Cuối cùng trong bài này, tôi sẽ viết về cách tạo ra một data validation, vì có nhiều loại nên tôi chỉ chọn một loại là list để trình bày, các loại khác cũng gần tương tự nên có dịp tôi sẽ trình bày sau :

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
6
$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
7

Trong một vài trường hợp, có thể list dữ liệu của bạn lấy luôn từ các giá trị có trong worksheet đó và bạn có thể xem đoạn code như sau :

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
8

Để tạo ra một chuỗi những drop-down list tương tự có cùng nội dung thì bạn có thể sử dụng vòng lặp tạo ra hàng loạt hoặc đôi khi bạn chỉ muốn sao chép từ cell này sang cell nào khác trong sheet, lúc này bạn dùng clone :

$objPHPExcel->getActiveSheet()->getStyle('A8:L8')->applyFromArray($BStyle);
9

Lời kết

Đến đây demo đã tương đối hoàn chỉnh, ở phần tiếp tôi sẽ trình bày tiếp về những tính năng khác mà PHPExcel cung cấp và hoàn thiện demo này,ví dụ như format số tiền theo định dạng mong muốn, tạo thiết lập bảo vệ file, thiết lập các thông số cho in ấn ...

code on github