การทำ export excel + PHP ด้วย PhpSpreadsheet

spreadsheet

วันนี้ผมมาแนะนำ Lib ของ PHP ที่ช่วยให้เราสามารถ export excel ได้อย่างง่ายดาย ด้วยใช้ lib ที่ชื่อ Phpspreadsheet ทำไมถึงเลือกใช้ Lib นี้แทน PHPExcel ก็เพราะว่า Phpspreadsheet  เป็นรุ่นต่อจาก PHPExcel นั้นหมายถึงว่า Phpspreadsheet ยังใหม่ สด กว่าและมีการปรับปรุง Code ให้สามารถทำงานได้ดีขึ้น อีกทั้งยังรองรับ PHP เวอร์ชั่นใหม่ล่าสุด และสาเหตุที่ผู้เขียนแนะนำให้ใช้ Phpspreadsheet  แทน PHPExcel เนื่องด้วยทางทีมงานจะพัฒนาเพิ่มฟีเจอร์ใหม่ ลงใส่ Phpspreadsheet กลับกัน PHPExcel จะไม่ได้มีการพัฒนาอีกต่อไป

การติดตั้ง

  1. ขั้นตอนการติดตั้งเราควรมี Composer ในเครื่องของเรา(มีแล้วข้ามขั้นตอนนี้ไปเลย) หากใครยังไม่มีสามารถดาวน์โหลดและติดตั้งไว้ได้เลย ลิงค์ดาวน์โหลดคลิกที่นี้
  2. เปิด command line และ CD ไปที่พาธโปรเจคของเราเช่น cd c:\xampp\htdoc\phpexcel
    install-spreadsheet-01
  3. พิมพ์ command “composer require phpoffice/phpspreadsheet” เพื่อติดตั้ง phpspreadsheet

การใช้งาน

เริ่มต้นด้วยตัวอย่าง code ด้านล่างนี้ครับ

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// mockup data by json file ex. you can use retrive data from db.
$json = file_get_contents('employee.json');
$employees = json_decode($json, true);

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// cell value
$spreadsheet->getActiveSheet()->setCellValue('A1', 'ทดสอบภาษาไทย by ITOFFSIDE.COM');
$spreadsheet->getActiveSheet()->setCellValue('A2', 12345.6789);
$spreadsheet->getActiveSheet()->setCellValue('A3', true);
$spreadsheet->getActiveSheet()->setCellValue(
    'A4',
    '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))'
);

// style
$spreadsheet->getActiveSheet()->getStyle('A2')
    ->getNumberFormat()
    ->setFormatCode(
        \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1
    );

$writer = new Xlsx($spreadsheet);

// save file to server and create link
$writer->save('excel/itoffside.xlsx');
echo '<a href="excel/itoffside.xlsx">Download Excel</a>';

จากตัวอย่าง Code ด้านบนเป็นการสร้างไฟล์ excel พร้อมข้อมูลและการจัดรูปแบบในแต่ละ Cell

ประกาศ object เพื่อเตรียมตัวการใช้งาน phpSpreadsheet
$spreadsheet = new Spreadsheet(); 

นำข้อมูลมาใส่ในแต่ละ Cell ใช้คำสั่งตาม code ด้านล่าง
$spreadsheet->getActiveSheet()->setCellValue(ช่องของ Cell, ข้อมูลที่จะมาใส่);

การกำหนด Style ให้กับ Cell ไม่ว่าจะเป็น Number, Currency, Date สามารถใช้คำสั่งตาม Code ด้านล่าง
$spreadsheet->getActiveSheet()->getStyle(‘A2’)
->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);

ส่วน Format มีให้ใช้ เช่น NumberFormat::FORMAT_DATE_DDMMYYYY เดี่ยวผมยกตัวอย่างการใช้ NumberFormat ไว้ด้านล่าง

FORMAT_GENERAL คือรูปแบบทั่วไป

FORMAT_TEXT คือเป็น Text

FORMAT_NUMBER รูปแบบตัวเลข เช่น 12346
FORMAT_NUMBER_00 รูปแบบตัวเลขมีจุดทศนิยม 2 หลัก เช่น 12346.54
FORMAT_NUMBER_COMMA_SEPARATED1 รูปแบบตัวเลขมีจุดทศนิยมและมีคอมม่าคั่น เช่น 123,001.65
FORMAT_NUMBER_COMMA_SEPARATED2 รูปแบบตัวเลขมีจุดทศนิยมและมีคอมม่าคั่นและเครื่องหมายขีดด้านหลัง เช่น 123,001.65.-

FORMAT_PERCENTAGE รูปแบบเปอร์เซ็นต์ เช่น 95%
FORMAT_PERCENTAGE_00 รูปแบบเปอร์เซ็นต์ที่มีจุดทศนิยม เช่น 95.41%

FORMAT_DATE_YYYYMMDD2 รูปแบบวันที่ เช่น 2018-09-15
FORMAT_DATE_YYYYMMDD รูปแบบวันที่ เช่น 18-09-15
FORMAT_DATE_DDMMYYYY รูปแบบวันที่ เช่น 15/09/18
FORMAT_DATE_DMYSLASH รูปแบบวันที่ เช่น 3/9/18 (วันที่/เดือน/ปี)
FORMAT_DATE_DMYMINUS รูปแบบวันที่ เช่น 3-9-18 (วันที่-เดือน-ปี)
FORMAT_DATE_DMMINUS รูปแบบวันที่ เช่น 3-9(วันที่-เดือน)
FORMAT_DATE_MYMINUS รูปแบบวันที่ เช่น 9/18 (เดือน/ปี)
FORMAT_DATE_XLSX14 รูปแบบวันที่ เช่น 09-19-18 (เดือน-วัน-ปี)

หากต้องการดูเพิ่มเติมสามารถดูที่ไฟล์ \vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Style\NumberFormat.php

หากต้องการใช้ Phpspreadsheet กับ ข้อมูล เช่นดึงข้อมูลจาก mysql มาเราสามารถใช้คำสั่ง
$spreadsheet->getActiveSheet()->fromArray($employees, null, ‘A2’);
เพื่อใส่ค่าข้อมูลลง Cell อัตโนมัติได้เลยโดยข้อมูลที่โยนเข้าไปนั้นต้องเป็น Array ครับ ผมจะยกตัวอย่าง มีการรับค่าเป็นข้อมูล พนักงาน ลงใส่ใน cell excel ครับ

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// mockup data by json file ex. you can use retrive data from db.
$json = file_get_contents('employee.json');
$employees = json_decode($json, true);

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// header
$spreadsheet->getActiveSheet()->setCellValue('A1', 'รหัสพนักงาน')
    ->setCellValue('B1', 'ชื่อ')
    ->setCellValue('C1', 'นามสกุล')
    ->setCellValue('D1', 'อีเมล์')
    ->setCellValue('E1', 'เพศ')
    ->setCellValue('F1', 'เงินเดือน')
    ->setCellValue('G1', 'เบอร์โทรศัพท์');

// cell value
$spreadsheet->getActiveSheet()->fromArray($employees, null, 'A2');

// style
$last_row = count($employees) + 1;
$spreadsheet->getActiveSheet()->getStyle('F2:F' . $last_row)
    ->getNumberFormat()
    ->setFormatCode(NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);

$spreadsheet->getActiveSheet()->getStyle('G1:G'.$last_row)->getNumberFormat()
    ->setFormatCode('0000000000');

$spreadsheet->getActiveSheet()->getStyle('A1:G1')->getFont()->setBold(true);

foreach(range('A','G') as $columnID) {
    $spreadsheet->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}

$writer = new Xlsx($spreadsheet);

// save file to server and create link
$writer->save('excel/itoffside.xlsx');
echo '<a href="excel/itoffside.xlsx">Download Excel</a>';

// save with browser
// header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// header('Content-Disposition: attachment; filename="itoffside.xlsx"');
// $writer->save('php://output');

ผลลัพธ์
spreadsheet

สำหรับบทความนี้ก็จบเพียงเท่านี้หวังว่าจะเป็นแนวทางให้ผู้อ่านนำไปใช้งานต่อไปครับ

ดาวน์โหลด

ดาวน์โหลด Sourcecode ตัวอย่าง

ดาวน์โหลดเสร็จแล้วให้ติดตั้ง Package Phpspreadsheet ด้วยครับ โดยใช้คำสั่งใน commanline “composer install” ตามรูปภาพด้านล่างครับ
install-spreadsheet-03

You May Also Like

About the Author: benext

โปรแกรมเมอร์ ติดต่อ : itoffside@hotmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.