phpexcel สร้างไฟล์ excel ได้สะดวกมาก แต่ไม่ใช่ทุกระบบจะสามารถ import ข้อมูลจากไฟล์แบบเอ็กเซลได้ การส่งออกไฟล์แบบตัวอักษรล้วนๆ และใช้เครื่องหมายคั่นแบบไฟล์ csv จึงยังจำเป็นอยู่
ที่สำคัญคือสามารถแก้หรือเพิ่มเงื่อนไขจาก code ส่งออกข้อมูลเป็น excel โดย phpexcel ที่มีอยู่เดิม โดยดัดแปลงเล็กน้อยในส่วน header และการ write data
PHPExcel_writer_csv.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <?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