สำหรับบทความนี้ ผู้เขียนจะแนะนำถึงการใช้งาน PHP XLSX Writer ซึ่งเป็น Library สำหรับ Export Excel ที่มีขนาดเล็ก รองรับการ Export ได้หลากหลายรูปแบบ ครับ
มาดูความสามารถ หลัก ๆ กันครับ
* supports PHP 5.2.1+
* takes UTF-8 encoded input
* multiple worksheets
* supports currency/date/numeric cell formatting, simple formulas
* supports basic cell styling
* supports writing huge 100K+ row spreadsheets
สำหรับข้อสุดท้ายอันนี้ถือว่า ช่วยแก้ปัญหา สำหรับการ Export ข้อมูลจำนวน มาก ๆ เป็น แสน ๆ เร็คคอร์ด เป็น Excel ซึ่งผู้เขียน ได้ลองใช้ Library หลาย ๆ ตัว พบว่า library ตัวนี้ มีขนาดเล็ก และ ใช้เวลาในการประมวลผล อยู่ในระดับที่ดีครับ ( Export ข้อมูลเป็น Excel ข้อมูลจำนวน 100000 ขึ้นไป )
รายละเอียดเพ่ิมเติม https://github.com/mk-j/PHP_XLSXWriter
ในการใช้งาน สามารถใช้งานได้ 2 รูปแบบด้วยกันคือ
1.เรียกใช้งานผ่าน หน้าเว็บ Browser เพื่อ Export File
ตัวอย่าง เมื่อเรียกไฟล์นี้ จะ Download File Excel ผ่าน Web Browser ให้อัตโนมัติ
include_once("xlsxwriter.class.php");
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL & ~E_NOTICE);
$filename = "example.xlsx";
header('Content-disposition: attachment; filename="'.XLSXWriter::sanitize_filename($filename).'"');
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$rows = array(
array('2003','1','-50.5','2010-01-01 23:00:00','2012-12-31 23:00:00'),
array('2003','=B1', '23.5','2010-01-01 00:00:00','2012-12-31 00:00:00'),
);
$writer = new XLSXWriter();
$writer->setAuthor('Some Author');
foreach($rows as $row)
$writer->writeSheetRow('Sheet1', $row);
$writer->writeToStdOut();
exit(0);
2.ใช้งานผ่าน CLI (Command-line user interface) เพื่อ สร้างไฟล์ Excel ก็ได้
ตัวอย่างการเรียกผ่าน CLI
<?php
include_once("xlsxwriter.class.php");
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL & ~E_NOTICE);
$filename = "example.xlsx";
$rows = array(
array('2003','1','-50.5','2010-01-01 23:00:00','2012-12-31 23:00:00'),
array('2003','=B1', '23.5','2010-01-01 00:00:00','2012-12-31 00:00:00'),
);
$writer = new XLSXWriter();
$writer->setAuthor('Some Author');
foreach($rows as $row)
$writer->writeSheetRow('Sheet1', $row);
$writer->writeToFile('example.xlsx');
จะมีการสร้างไฟล์ Excel ไว้ใน Path ที่ต้องการ เมือรันไฟล์นี้จะมีการสร้างไฟล์ Excel ไว้ที่ C://xampp/htdocs/Demo/example.xlsx (แต่ละเครื่อง path อาจไม่เหมือนกันนะครับ)
มาดูตัวอย่างกันเลยดีกว่า
(จริง ๆ แล้ว ในตัว Library ผู้ที่สร้าง mk-j เขาได้ทำ ตัวอย่าง (Examples) ไว้ละเอียดอยู่แล้วครับ สามารถเปิดดูและทดลองรันได้เลย แต่ผู้เขียนอยาก บันทึกไว้เผื่อมีโอกาสได้ใช้งานอีกครับ)
หมายเหตุ ตัวอย่างทั้งหมดต่อไปนี้จะเป็นการเรียกใช้งาน แบบ CLI ครับ
Example 1 Create Excel File
<?php
set_include_path( get_include_path().PATH_SEPARATOR."..");
include_once("xlsxwriter.class.php");
$header = array(
'c1-text'=>'string',//text
'c2-text'=>'@',//text
'c3-integer'=>'integer',
'c4-integer'=>'0',
'c5-price'=>'price',
'c6-price'=>'#,##0.00',//custom
'c7-date'=>'date',
'c8-date'=>'YYYY-MM-DD',
);
$rows = array(
array('x101',102,103,104,105,106,'2018-01-07','2018-01-08'),
array('x201',202,203,204,205,206,'2018-02-07','2018-02-08'),
array('x301',302,303,304,305,306,'2018-03-07','2018-03-08'),
array('x401',402,403,404,405,406,'2018-04-07','2018-04-08'),
array('x501',502,503,504,505,506,'2018-05-07','2018-05-08'),
array('x601',602,603,604,605,606,'2018-06-07','2018-06-08'),
array('x701',702,703,704,705,706,'2018-07-07','2018-07-08'),
);
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', $header);
foreach($rows as $row)
$writer->writeSheetRow('Sheet1', $row);
$writer->writeToFile('xlsx-simple.xlsx');
สังเกตตรง $header เราสามารถกำหนดHeader ของ Cells และ รูปแบบของเซล์ (Format Cells) ให้กับข้อมูลที่ต้องการได้
$header = array( 'c1-text'=>'string',//text 'c2-text'=>'@',//text 'c3-integer'=>'integer', 'c4-integer'=>'0', 'c5-price'=>'price', 'c6-price'=>'#,##0.00',//custom 'c7-date'=>'date', 'c8-date'=>'YYYY-MM-DD', );
ผลการทำงาน PHP_XLSXWriter จะทำการสร้างไฟล์ xlsx-simple.xlsx ให้ทันที
Example 2 Create Excel File Multiple Sheets
ในตัวอย่างนี้จะเป็นการ สร้างไฟล์ Excel แบบมีหลาย ๆ Sheet ให้ไฟล์เดียว
<?php
set_include_path( get_include_path().PATH_SEPARATOR."..");
include_once("xlsxwriter.class.php");
//กำหนด Header และ Format Cells
$header = array(
'year'=>'string',
'month'=>'string',
'amount'=>'price',
'first_event'=>'datetime',
'second_event'=>'date',
);
//ข้อมูลที่ต้องการแสดงใน Sheet1
$data1 = array(
array('2003','1','-50.5','2010-01-01 23:00:00','2012-12-31 23:00:00'),
array('2003','=B2', '23.5','2010-01-01 00:00:00','2012-12-31 00:00:00'),
array('2003',"'=B2", '23.5','2010-01-01 00:00:00','2012-12-31 00:00:00'),
);
//ข้อมูลที่ต้องการแสดงใน Sheet2
$data2 = array(
array('2003','01','343.12','4000000000'),
array('2003','02','345.12','2000000000'),
);
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', $header);
foreach($data1 as $row)
$writer->writeSheetRow('Sheet1', $row);
foreach($data2 as $row)
$writer->writeSheetRow('Sheet2', $row);
$writer->writeToFile('xlsx-sheets.xlsx');
exit(0);
ผลการทำงาน PHP_XLSXWriter จะทำการสร้างไฟล์ xlsx-sheets.xlsx และจะมี การแบ่ง Sheet1 และ Sheet2 ภายในไฟล์ให้อีกด้วย
Example 3 Create Excel File Style Text
ในตัวอย่างนี้เป็นการสร้างไฟล์ Excel โดยที่เราสามารถ กำหนด รูปแบบของข้อความ ( Style )ใน cells
ตัวอย่าง Options ที่สามารถกำหนด Style ให้กับข้อความได้
<?php
set_include_path( get_include_path().PATH_SEPARATOR."..");
include_once("xlsxwriter.class.php");
$sheet1header = array(
'c1-string'=>'string',
'c2-integer'=>'integer',
'c3-custom-integer'=>'0',
'c4-custom-1decimal'=>'0.0',
'c5-custom-2decimal'=>'0.00',
'c6-custom-percent'=>'0%',
'c7-custom-percent1'=>'0.0%',
'c8-custom-percent2'=>'0.00%',
'c9-custom-text'=>'@',//text
);
$sheet2header = array(
'col1-date'=>'date',
'col2-datetime'=>'datetime',
'custom-date1'=>'YYYY-MM-DD',
'custom-date2'=>'MM/DD/YYYY',
'custom-date3'=>'DD-MMM-YYYY HH:MM AM/PM',
'custom-date4'=>'MM/DD/YYYY HH:MM:SS',
'custom-date5'=>'YYYY-MM-DD HH:MM:SS',
'custom-date6'=>'YY MMMM',
'custom-date7'=>'QQ YYYY',
);
$sheet3header = array(
'col1-dollar'=>'dollar',
'col2-euro'=>'euro',
'custom-amount1'=>'0',
'custom-amount2'=>'0.0',//1 decimal place
'custom-amount3'=>'0.00',//2 decimal places
'custom-currency1'=>'#,##0.00',//currency 2 decimal places, no currency/dollar sign
'custom-currency2'=>'[$$-1009]#,##0.00;[RED]-[$$-1009]#,##0.00',//w/dollar sign
'custom-currency3'=>'#,##0.00 [$€-407];[RED]-#,##0.00 [$€-407]',//w/euro sign
'custom-currency4'=>'[$¥-411]#,##0;[RED]-[$¥-411]#,##0', //japanese yen
'custom-scientific'=>'0.00E+000',//-1.23E+003 scientific notation
);
$pi = 3.14159;
$date = '2018-12-31 23:59:59';
$amount = '5120.5';
$writer = new XLSXWriter();
$writer->setAuthor('Some Author');
$writer->writeSheetHeader('BasicFormats',$sheet1header);
$writer->writeSheetRow('BasicFormats',array($pi,$pi,$pi,$pi,$pi,$pi,$pi,$pi,$pi) );
$writer->writeSheetHeader('Dates',$sheet2header);
$writer->writeSheetRow('Dates',array($date,$date,$date,$date,$date,$date,$date,$date,$date) );
$writer->writeSheetHeader('Currencies',$sheet3header);
$writer->writeSheetRow('Currencies',array($amount,$amount,$amount,$amount,$amount,$amount,$amount,$amount,$amount) );
$writer->writeToFile('xlsx-formats.xlsx');
exit(0);
ผลการทำงาน จะเห็นว่าเราสามารถกำหนดสี หรือ รูปแบบ ต่าง ๆ ให้กับข้อความต่าง ๆ ใน Excel ตามต้องการได้
Example 4 Create Excel File 250000 Rows
ตัวอย่างนี้จะเป็นการสร้างไฟล์ Excel ที่มีจำนวน Rows มากถึง 250000 (สองแสนห้าหมื่น)
โดยในหน้า Github ของ PHP_XLSXWriter ได้ให้ข้อมูลไว้ว่าจะใช้เวลาประมวณผล ข้อมูล 2500000 ประมาณ 7 วินาที

ส่วนจะเป็นตามนั้นหรือไม่ต้องไปลองทดสอบกันเองครับ แต่การนำไปใช้งานจริงผู้เขียนคิดว่า อาจต้องใช้เวลามากกว่านี้ครับ ในส่วนของการไปดึงข้อมูลมาจาก Database ก่อนที่ Library จะนำไปสร้างเป็นไฟล์ Excel
<?php
set_include_path( get_include_path().PATH_SEPARATOR."..");
include_once("xlsxwriter.class.php");
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', array('c1'=>'integer','c2'=>'integer','c3'=>'integer','c4'=>'integer') );//optional
for($i=0; $i<250000; $i++)
{
$writer->writeSheetRow('Sheet1', array(rand()%10000,rand()%10000,rand()%10000,rand()%10000) );
}
$writer->writeToFile('xlsx-numbers-250k.xlsx');
echo '#'.floor((memory_get_peak_usage())/1024/1024)."MB"."\n";
ตัวอย่างไฟล์ที่ได้
ตัวอย่างการ Export เป็นไฟล์ Excel โดยใช้ ข้อมูลจาก Database MySQL
ก่อนอื่นเรามาสร้างฐานข้อมูลชื่อ Demo กันก่อนครับ
ตัวอย่าง Database SQL ที่ใช้ในตัวอย่างนี้
create table PHP_XLSXWriter ( id INT, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(50), gender VARCHAR(50), ip_address VARCHAR(20) ); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (1, 'Claudianus', 'Kruszelnicki', 'ckruszelnicki0@sakura.ne.jp', 'Male', '173.239.182.8'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (2, 'Dionisio', 'Andreopolos', 'dandreopolos1@discuz.net', 'Male', '85.54.3.9'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (3, 'Niki', 'Novotne', 'nnovotne2@hugedomains.com', 'Male', '63.56.39.217'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (4, 'Billie', 'Arnau', 'barnau3@state.gov', 'Male', '131.135.104.206'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (5, 'Garner', 'Campaigne', 'gcampaigne4@geocities.com', 'Male', '148.45.186.137'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (6, 'Marleen', 'Carabine', 'mcarabine5@domainmarket.com', 'Female', '116.61.153.192'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (7, 'Quintina', 'Stilgoe', 'qstilgoe6@e-recht24.de', 'Female', '92.105.23.198'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (8, 'Damaris', 'Luberto', 'dluberto7@blogtalkradio.com', 'Female', '206.111.63.21'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (9, 'Giffer', 'Dubbin', 'gdubbin8@dailymotion.com', 'Male', '231.2.171.18'); insert into PHP_XLSXWriter (id, first_name, last_name, email, gender, ip_address) values (10, 'Holly', 'Brogan', 'hbrogan9@homestead.com', 'Female', '30.54.82.70');
ตัวอย่างที่ 1 PHP_XLSXWriter Download File Excel With Web Browser
<?php
include_once("xlsxwriter.class.php");
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL & ~E_NOTICE);
$filename = "example.xlsx";
header('Content-disposition: attachment; filename="'.XLSXWriter::sanitize_filename($filename).'"');
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$servername = "localhost";
$username = "root";
$password = "";
$db_name = "demo";
// สร้างการเชื่อมต่อฐานข้อมูล
$conn = mysqli_connect($servername, $username, $password,$db_name);
//กำหนด charset ให้เป็น utf8 เพื่อรองรับภาษาไทย
mysqli_set_charset($conn,"utf8");
// ตรวจสอบการเชื่อมต่อฐานข้อมูล
if (!$conn) {
//กรณีเชื่อมต่อไม่ได้
die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT * FROM php_xlsxwriter";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
$rows[] = [
'id',
'first_name',
'last_name',
'email',
'gender',
'ip_address',
];
while ($r = mysqli_fetch_assoc($result)) {
$rows[] = [
$r['id'],
$r['first_name'],
$r['last_name'],
$r['email'],
$r['gender'],
$r['ip_address'],
];
}
$writer = new XLSXWriter();
$writer->setAuthor('Some Author');
foreach($rows as $row)
$writer->writeSheetRow('Sheet1', $row);
$writer->writeToStdOut();
}
mysqli_close($conn);
exit(0);
ผลการทำงาน เมื่อ เปิดไฟล์นี้ Web Browser จะมีการ Download ไฟล์ Excel ให้ อัตโนมัติครับ
ตัวอย่างที่ 2 PHP_XLSXWriter Create File Excel With CLI
<?php
include_once("xlsxwriter.class.php");
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL & ~E_NOTICE);
$servername = "localhost";
$username = "root";
$password = "";
$db_name = "demo";
// สร้างการเชื่อมต่อฐานข้อมูล
$conn = mysqli_connect($servername, $username, $password,$db_name);
//กำหนด charset ให้เป็น utf8 เพื่อรองรับภาษาไทย
mysqli_set_charset($conn,"utf8");
// ตรวจสอบการเชื่อมต่อฐานข้อมูล
if (!$conn) {
//กรณีเชื่อมต่อไม่ได้
die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT * FROM php_xlsxwriter";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
$rows[] = [
'id',
'first_name',
'last_name',
'email',
'gender',
'ip_address',
];
while ($r = mysqli_fetch_assoc($result)) {
$rows[] = [
$r['id'],
$r['first_name'],
$r['last_name'],
$r['email'],
$r['gender'],
$r['ip_address'],
];
}
$writer = new XLSXWriter();
$writer->setAuthor('Some Author');
foreach($rows as $row)
$writer->writeSheetRow('Sheet1', $row);
$writer->writeToFile('example_cli.xlsx');
}
mysqli_close($conn);
exit(0);
ผลการทำงาน เมื่อรันไฟล์นี้ ผ่านหน้า Web Browser จะไม่มีอะไรเกิดขึ้นครับ แต่ จะมีการสร้างไฟล์ Excel ที่ชื่อว่า example_cli.xlsx ตาม path (ตัวอย่าง C://xampp/htdocs/Demo/) ให้ทันทีครับ
ผู้เขียนหวังว่าบทความนี้จะเป็นประโยชน์ต่อเพื่อน ๆ ที่กำลังหาข้อมูลการ Export Excel อยู่นะครับ
ตัวอย่าง Code ประกอบบทความ
ขอขอบคุณข้อมูลจาก
https://github.com/mk-j/PHP_XLSXWriter