ใช้ PHPExcel ดึงข้อมูลออกมา แต่ไม่สามารถ insert เข้า database ได้เลย ลอง debug เอา query string ออกมาดูก็เห็นสาเหตุ เพราะวันที่โดนแปลงจาก 1982-08-05 ไปเป็นตัวเลขประมาณ 3455 ทุก row เลย พอเข้า sql server มันก็ฟ้องมาว่าไม่ใช่วันที่นะ
หาเจอในเน็ต how to get date from excel using PHPExcel library แล้วก็หลาย ๆ ที่ ก็ใช้วิธี
$cell = $objWorksheet->getCell ('A2') ;
$value = trim ($cell->getValue ()) ;
/* detect if the cell value is formated to date or not */
if (\PHPExcel_Shared_Date::isDateTime ($cell)) { $value = date ('Y-m-d', \PHPExcel_Shared_Date::ExcelToPHP ($value)) ;
}
แต่ผลที่ได้ก็เหมือนเดิม
เกือบจะยอมแพ้แล้วจน ไปเจอคนจุดประเด็นว่า isDateTime มันตรวจโดยใช้ format mm-dd-yyyy ใน PHPExcel detect if the cell value is formated to date or not ลองเทสดูก็จริง เพราะเดิมใช้เป็น format yyyy-mm-dd ลองเปลี่ยนเป็น mm-dd-yyyy ดู สามารถดึงออกมาเป็นวันที่แล้ว ไม่ใช้ int เหมือนเดิม
เพราะว่า sql server มันใช้รูปแบบ yyyy-mm-dd และไม่อยากจะเปลี่ยนไปเปลี่ยนมา เรียงตาม ปี เดือน วัน มันดูง่ายดีแล้ว วันไหนก่อนหลัง ก็ลองหาทางดู จะเปลี่ยนคอนฟิกใหม่ ให้ใช้วันที่แบบ yyyy-mm-dd โดยเพิ่ม
$objPHPExcel->getDefaultStyle () ->getNumberFormat () ->setFormatCode (\PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) ;
โดยมีรูปแบบอื่น ๆ ให้เลือกคือ Class: PHPExcel_Style_NumberFormat
ทดลองนำเข้าข้อมูลอีกครั้ง สามารถนำเข้าข้อมูลได้โดยไม่มีปัญหาแล้ว
หล้งจากแก้ข้อมูลแล้วต้องแน่ใจว่าใส่ข้อมูลถูก format เป็น yyyy-mm-dd จริง ๆ เพราะว่าตอนเทสเจอใส่ 10/09/1987 มา ค่า value ก่อนแปลงได้ -2208211200 แทนที่จะเป็น 143856000 และหลังแปลงได้ปี 2036-02-16 ไม่ใช่ปี 1987 วันที่มันจะผิดไปหมดเลยครับ อาจจะใช้
if (!preg_match ('/^ (19|20) \d\d[\-\/.] (0[1-9]|1[012]) [\-\/.] (0[1-9]|[12][0-9]|3[01]) $/', $value)) { $this->error = true; $cell->setValue ('Your date "'. $cell->getValue () .'" does not match the YYYY-MM-DD required format.') ; $objWorksheet->getStyle ($coordinate) ->applyFromArray ($this->stylesError) ; }
อ่านเพิ่มเติม อ่านข้อมูลจาก excel