phpexcel สร้างไฟล์ excel ได้สะดวกมาก แต่ไม่ใช่ทุกระบบจะสามารถ import ข้อมูลจากไฟล์แบบเอ็กเซลได้ การส่งออกไฟล์แบบตัวอักษรล้วนๆ และใช้เครื่องหมายคั่นแบบไฟล์ csv จึงยังจำเป็นอยู่
ที่สำคัญคือสามารถแก้หรือเพิ่มเงื่อนไขจาก code ส่งออกข้อมูลเป็น excel โดย phpexcel ที่มีอยู่เดิม โดยดัดแปลงเล็กน้อยในส่วน header และการ write data
PHPExcel_writer_csv.php
<?php
/* PHPExcel_IOFactory - Reader */
include 'PHPOffice/PHPExcel/Classes/PHPExcel.php';
$objPHPExcel = new PHPExcel();
/* Set default style */
$defaultStyle = $objPHPExcel->getDefaultStyle();
$defaultStyle->getFont()
->setName('Arial')
->setSize(11);
$defaultStyle->getNumberFormat()
->setFormatCode('yyyy-mm-dd');
/* Set document properties */
$title = 'Exports_Datas_' . date('Y-m-d_H:i');
$objPHPExcel->getProperties()->setCreator('Pitt Phunsanit')
->setCategory('Exports Datas')
->setDescription($title)
->setKeywords('Exports Datas ' . date('Y-m-d'))
->setSubject($title)
->setTitle($title);
/* rename sheet */
$objWorkSheet = $objPHPExcel->getActiveSheet();
$objWorkSheet->setTitle('Exports Datas');
for ($rowNo = 1; $rowNo < 10; $rowNo++) {
for ($colNo = 0; $colNo < 5; $colNo++) {
$insert = rand(0, 1);
if($insert == 1) {
$colString = PHPExcel_Cell::stringFromColumnIndex($colNo);
$coordinate = $colString . $rowNo;
$objWorkSheet->setCellValue($coordinate, 'ส่งออกข้อมูล -> '.$coordinate);
}
}
}
header('Cache-Control: max-age=0');
header('Content-Encoding: UTF-8');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment;filename="'.$title.'.csv"');
echo "\xEF\xBB\xBF"; /* UTF-8 BOM */
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');
/* set Delimiter, (defaults ,) */
//$objWriter->setDelimiter('|');
//$objWriter->setEnclosure('');
/* Set line ending (defaults PHP_EOL) */
//$objWriter->setLineEnding('0x0d0a');
$objWriter->save('php://output');
ถ้าสังเกตจะมี $insert = rand(0, 1); และ if($insert == 1) { ทำให้บาง cell ไม่มีข้อมูล เพื่อที่จะแสดงให้เห็นว่าการใช้ phpexcel จะดีกว่าการใช้ echo ส่งออกข้อมูลแบบที่ง่ายที่สุด (CSV) ในกรณีที่บางคอลัมข้อมูลไม่มี เราไม่จำเป็นต้อง echo ค่าว่าง หรือมานับ , ว่าครบมั๋ย phpexcel จะจัดการให้เอง
ถ้าเปลี่ยนรูปแบบอื่น เช่น
- ต้องการใช้เครื่องหมายอื่น เช่น pipe | ก็สามารถกำหนดโดยใช่ setDelimiter
- ต้องการ wrap ข้อมูลก็ใช้ setEnclosure จะปิดหัว ปิดท้ายข้อมูลแต่ละ cell ให้
- ต้องการใช้เครื่องมายอื่นในการแบ่งข้อมูลออกเป็นชุดๆ ก็ setLineEnding
เขียนครั้งเดียวส่งออกข้อมูลได้ 2 รูปแบบ ส่วนคำสั่งที่ไม่ได้ใช้ในรูปแบบ csv เช่น setTitle ก็ไม่ทำให้มี error ดีจริงๆ phpexcel