PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum


การอ่านไฟล์ Excel หรือ CSV ไฟล์ด้วย PHPExcel โดยใช้ php อย่างง่าย

12 April 2017 By
phpexcel excel อ่านไฟล์ excel csv


สำหรับเนื้อหานี้ เป็นแนวทางสำหรับใช้ในการอ่านไฟล์ข้อมูลที่อยู่ในรุปแบบไฟล์ Excel หรือ CSV
ในตัวอย่างเราทดสอบไฟล์นามสกุล csv,xls และ xlsx เพื่อเป็นแนว
    รูปแบบการใช้งาน PHPExcel class ในการจัดการเกี่ยวไฟล์ excel นั้นเราเคยนำเสนอไปแล้ว
ในหลายบทความ แต่มีบางส่วนไปใช้งานร่วมกับ Codeigniter php framework ดูได้ที่บทความ
ตามลิ้งค์ด้านล่าง
 
บทความเกี่ยวกับ PHPExcel
http://www.ninenik.com/google_search.php?tags=phpexcel
 
สำหรับใครที่ไม่ได้ใช้งานร่วมกับ Codeigniter ให้เริ่มต้นตามบทความนี้ก่อน 
โดยดาวน์โหลด PHPExcel class มาไว้สำหรับใช้งาน

 
ออกรายงานเป็น excel ไฟล์ด้วย PHPExcel ตอนเริ่มใช้ 
http://www.ninenik.com/content.php?arti_id=633 via @ninenik


 
ต่อไปให้เราสร้างไฟล์ทดสอบขึ้นมา ชื่อไฟล์ simple_read_excel.php
 

ไฟล์ simple_read_excel.php

 
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Bangkok');
// http://php.net/manual/en/timezones.php
require_once("Classes/PHPExcel.php");
?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
    <link rel="stylesheet" href="https://unpkg.com/bootstrap@3.3.7/dist/css/bootstrap.min.css">
     
</head>
<body>
 
<br>
<br>

<!-- ส่วนของฟอร์มส่งค่า --> 
<div class="container" style="width:600px;margin:auto;">
<form action="" method="post" enctype="multipart/form-data" name="form1">
FILE: <input type="file" name="_fileup" id="_fileup"><br>
<button type="submit" name="btn_submit">Send</button>

</form>
</div>

<br>
<br>
<!--  ส่วนของการแสดงค่า -->
 <div class="container" style="width:600px;margin:auto;">
 <pre>
<?php 
if(isset($_POST['btn_submit'])  && isset($_FILES['_fileup']['name']) && $_FILES['_fileup']['name']!=""){
	$tmpFile = $_FILES['_fileup']['tmp_name'];  
	$fileName = $_FILES['_fileup']['name'];  // เก็บชื่อไฟล์
	$_fileup = $_FILES['_fileup'];
	$info = pathinfo($fileName);
	$allow_file = array("csv","xls","xlsx");
/*	print_r($info);         // ข้อมูลไฟล์ 	
    print_r($_fileup);*/
	if($fileName!="" && in_array($info['extension'],$allow_file)){
        // อ่านไฟล์จาก path temp ชั่วคราวที่เราอัพโหลด
        $objPHPExcel = PHPExcel_IOFactory::load($tmpFile);		
		
		
        // ดึงข้อมูลของแต่ละเซลในตารางมาไว้ใช้งานในรูปแบบตัวแปร array
        $cell_collection = $objPHPExcel->getActiveSheet()->getCellCollection();
         
        // วนลูปแสดงข้อมูล
		$v=1;
        foreach ($cell_collection as $cell) {
            // ค่าสำหรับดูว่าเป็นคอลัมน์ไหน เช่น A B C ....
            $column = $objPHPExcel->getActiveSheet()->getCell($cell)->getColumn();
            // คำสำหรับดูว่าเป็นแถวที่เท่าไหร่ เช่น 1 2 3 .....
            $row = $objPHPExcel->getActiveSheet()->getCell($cell)->getRow();
            // ค่าของข้อมูลในเซลล์นั้นๆ เช่น A1 B1 C1 ....
            $data_value = $objPHPExcel->getActiveSheet()->getCell($cell)->getValue();          
            
            // เท่านี้เราก็สามารถแสดงข้อมูลจากการอ่านไฟล์ได้แล้ว และสามารถนำข้อมูลเหล่านี้
            // ทำการบันทักลงฐานข้อมูล หรือแสดงได้เลย
            echo $v." ----  ".$data_value."<br>";
             $v++;
        }		
		
	}
} 
?>
 </pre>
</div>

 

</body>
</html>
 
จะเห็นว่ารูปแบบการเขียนโค้ดสำหรับอ่านไฟล์ Excel หรือ CSV ไฟล์นั้นค่อนข้างง่าย
จากรูปแบบโค้ดด้านบน ตัวแปร $cell_collection จะเก็บข้อมูลของ cell ที่มีข้อมูลของ
ไฟล์ excel ไว้ในรูปแบบ array โดยเก็บจากซ้ายไปขวา และบนลงล่าง เฉพาะ cell ที่ไม่เป็น
ค่าว่าง ดูรูปตัวอย่างไฟล์ excel ด้านล่างประกอบ
 
 

 
 
จากรูปเรา highlight เฉพาะส่วนที่ตัวแปร $cell_collection จัดเก็บค่าไว้ในตัวแปร array ก็คือเฉพาะ
ส่วนที่เป็นสีเหลือง หรือไม่ใช้ค่าว่าง โดยจะเริ่มเก็บข้อมูลจากซ้ายไปขวา และบนลงล่าง
เช่น A1 B1 C1 ...  A2 B2 C2 ...... ไปเรื่อยๆ จนครบทุก cell ที่ไม่เป็นค่าว่าง
 
โค้ดด้านบน เป็นตัวอย่างที่วนลูปแสดงข้อมูลแต่ละ cell ออกมา ไม่ได้มีการจัดเป็นแถว ให้ใช้งานง่ายแต่อย่างไร
ซึ่งจะเหมาะสำหรับดึงข้อมูลของไฟล์ที่มีคอลัมน์เดียว คือมีรายการข้อมูลทั้งหมดอยู่ในคอลัมน์ A รูปแบบโค้ด
ด้านบน เราสามารถใช้วนลูปแสดงรายการทั้งหมด มาใช้งานได้เลย
 
 
ทีนี้เราจะมาประยุกต์ต่อจากโค้ดด้านบน โดยใช้ตัวอย่างไฟล์ excel เดิมเราต้องการ ข้อมูลเฉพาะส่วนที่ highligth
ตามรูป
 


 
 
เราต้องการจะดึงข้อมูลให้ได้รูปแบบคล้ายกับดึงจากฐานข้อมูล โดยดึงข้อมูลตั้งแต่ row ที่สองลงไป
สามารถทำได้ดังนี้
 
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Bangkok');
// http://php.net/manual/en/timezones.php
require_once("Classes/PHPExcel.php");
?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
    <link rel="stylesheet" href="https://unpkg.com/bootstrap@3.3.7/dist/css/bootstrap.min.css">
     
</head>
<body>
 
<br>
<br>

<!-- ส่วนของฟอร์มส่งค่า --> 
<div class="container" style="width:600px;margin:auto;">
<form action="" method="post" enctype="multipart/form-data" name="form1">
FILE: <input type="file" name="_fileup" id="_fileup"><br>
<button type="submit" name="btn_submit">Send</button>

</form>
</div>

<br>
<br>
<!--  ส่วนของการแสดงค่า -->
 <div class="container" style="width:600px;margin:auto;">
 <pre>
<?php 
if(isset($_POST['btn_submit'])  && isset($_FILES['_fileup']['name']) && $_FILES['_fileup']['name']!=""){
	$tmpFile = $_FILES['_fileup']['tmp_name'];  
	$fileName = $_FILES['_fileup']['name'];  // เก็บชื่อไฟล์
	$_fileup = $_FILES['_fileup'];
	$info = pathinfo($fileName);
	$allow_file = array("csv","xls","xlsx");
/*	print_r($info);         // ข้อมูลไฟล์ 	
    print_r($_fileup);*/
	if($fileName!="" && in_array($info['extension'],$allow_file)){
        // อ่านไฟล์จาก path temp ชั่วคราวที่เราอัพโหลด
        $objPHPExcel = PHPExcel_IOFactory::load($tmpFile);		
		
		
        // ดึงข้อมูลของแต่ละเซลในตารางมาไว้ใช้งานในรูปแบบตัวแปร array
        $cell_collection = $objPHPExcel->getActiveSheet()->getCellCollection();
         
        // วนลูปแสดงข้อมูล
		$data_arr=array();
        foreach ($cell_collection as $cell) {
            // ค่าสำหรับดูว่าเป็นคอลัมน์ไหน เช่น A B C ....
            $column = $objPHPExcel->getActiveSheet()->getCell($cell)->getColumn();
            // คำสำหรับดูว่าเป็นแถวที่เท่าไหร่ เช่น 1 2 3 .....
            $row = $objPHPExcel->getActiveSheet()->getCell($cell)->getRow();
            // ค่าของข้อมูลในเซลล์นั้นๆ เช่น A1 B1 C1 ....
            $data_value = $objPHPExcel->getActiveSheet()->getCell($cell)->getValue();          
            
			// เริ่มขึ้นตอนจัดเตรียมข้อมูล
			// เริ่มเก็บข้อมูลบรรทัดที่ 2 เป็นต้นไป
			$start_row = 2;
			// กำหนดชื่อ column ที่ต้องการไปเรียกใช้งาน
			$col_name = array(
				"A"=>"cus_id",
				"B"=>"cus_name",
				"C"=>"order_id",
				"D"=>"pro_id",
				"E"=>"pro_name"
			);
			if($row >= $start_row){
				$data_arr[$row-$start_row][$col_name[$column]] = $data_value;												
			}
        }		
//		print_r($data_arr);
	}
} 
?>
 </pre>
 
 <br>
<pre>
<table class="table table-bordered">
<?php
// สร้างฟังก์ชั่นสำหรับจัดการกับข้อมุลที่เป็นค่าว่าง หรือไม่มีข้อมูลน้้น
function prepare_data($data){
	// กำหนดชื่อ filed ให้ตรงกับ $col_name ด้านบน
	$arr_field = array("cus_id","cus_name","order_id","pro_id","pro_name");
	if(is_array($data)){
		foreach($arr_field as $v){
			if(!isset($data[$v])){
				$data[$v]="";			
			}
		}
	}
	return $data;
}

// นำข้อมูลที่ดึงจาก excel หรือ csv ไฟล์ มาวนลูปแสดง
if(isset($data_arr) && count($data_arr)>0){
	foreach($data_arr as $row){
		$row = prepare_data($row);
?>
	<tr>
		<td><?=$row['cus_id']?></td>
		<td><?=$row['cus_name']?></td>
		<td><?=$row['order_id']?></td>
		<td><?=$row['pro_id']?></td>
        <td><?=$row['pro_name']?></td>
	</tr>
<?php
	}
}
?>    
</table>
</pre>
</div>

</body>
</html>
 
จากโค้ดด้านบน ถ้าเราเอาไปใช้งาน ส่วนที่ต้องแก้ไขหรือปรับคือ บรรทัดที่ 68 - 76 และ
บรรทัดที่ 94 ให้ปรับให้ตรงกับรูปแบบข้อมูลไฟล์ excel ของเรา
 
 
ต่อไปอีกตัวอย่าง สมมติเราต้อกาาดึงข้อมูลเฉพาะที่เราต้องการ เช่นอยากได้ตำแหน่ง C3 B5
D7... แบบนนี้เป้นต้น ตามตำแหน่งดังรูป
 


 
 
หรือก็คือลักษณะ เฉพาะเจาะจง cell ใดๆ ก็ได้ที่มีข้อมูลตามต้องการ เราสามารถใช้รูปแบบโค้ดังนี้ได้
 
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Bangkok');
// http://php.net/manual/en/timezones.php
require_once("Classes/PHPExcel.php");
?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
    <link rel="stylesheet" href="https://unpkg.com/bootstrap@3.3.7/dist/css/bootstrap.min.css">
     
</head>
<body>
 
<br>
<br>

<!-- ส่วนของฟอร์มส่งค่า --> 
<div class="container" style="width:600px;margin:auto;">
<form action="" method="post" enctype="multipart/form-data" name="form1">
FILE: <input type="file" name="_fileup" id="_fileup"><br>
<button type="submit" name="btn_submit">Send</button>

</form>
</div>

<br>
<br>
<!--  ส่วนของการแสดงค่า -->
 <div class="container" style="width:600px;margin:auto;">
 <pre>
<?php 
if(isset($_POST['btn_submit'])  && isset($_FILES['_fileup']['name']) && $_FILES['_fileup']['name']!=""){
	$tmpFile = $_FILES['_fileup']['tmp_name'];  
	$fileName = $_FILES['_fileup']['name'];  // เก็บชื่อไฟล์
	$_fileup = $_FILES['_fileup'];
	$info = pathinfo($fileName);
	$allow_file = array("csv","xls","xlsx");
/*	print_r($info);         // ข้อมูลไฟล์ 	
    print_r($_fileup);*/
	if($fileName!="" && in_array($info['extension'],$allow_file)){
        // อ่านไฟล์จาก path temp ชั่วคราวที่เราอัพโหลด
        $objPHPExcel = PHPExcel_IOFactory::load($tmpFile);		
		
		
        // ดึงข้อมูลของแต่ละเซลในตารางมาไว้ใช้งานในรูปแบบตัวแปร array
        $cell_collection = $objPHPExcel->getActiveSheet()->getCellCollection();
         
        // วนลูปแสดงข้อมูล
		$data_arr=array();
        foreach ($cell_collection as $cell) {
            // ค่าสำหรับดูว่าเป็นคอลัมน์ไหน เช่น A B C ....
            $column = $objPHPExcel->getActiveSheet()->getCell($cell)->getColumn();
            // คำสำหรับดูว่าเป็นแถวที่เท่าไหร่ เช่น 1 2 3 .....
            $row = $objPHPExcel->getActiveSheet()->getCell($cell)->getRow();
            // ค่าของข้อมูลในเซลล์นั้นๆ เช่น A1 B1 C1 ....
            $data_value = $objPHPExcel->getActiveSheet()->getCell($cell)->getValue();          
            
			// เริ่มขึ้นตอนจัดเตรียมข้อมูล
			$data_arr[$column.$row]=$data_value;
        }		
//		print_r($data_arr);
	}
} 
?>
 </pre>
 
 <br>
<pre>
<table class="table table-bordered">
<?php
// นำข้อมูลที่ดึงจาก excel หรือ csv ไฟล์ มาแสดง
if(isset($data_arr) && count($data_arr)>0){

?>
	<tr>
		<td>
		C3:<?=$data_arr['C3']?><br>
		B5:<?=$data_arr['B5']?><br>
		D7:<?=$data_arr['D7']?>
        </td>
	</tr>
<?php
}
?>    
</table>
</pre>
</div>

</body>
</html>

 
วิธีตามตัวอย่างโค้ดด้านบน เหมาะกับรูปแบบไฟล์ excel ที่มีตำแหน่งของข้อมูลฟิกต์ เราใช้ค่าตำแหน่ง
เดิมๆ ไปใช้งาน หรือก็คืออ้างอิงตามตำแหน่งของ cell ใน excel ไฟล์ เช่น <?=$data_arr['C3']?> 
 
ทั้งหมดนี้เป็นแนวทางในการดึงข้อมูลจากไฟล์ excel หรือ csv ไฟล์ มาแสดง เราสามารถประยุกต์ต่อได้ เช่น
นำข้อมูลที่ได้ไปบันทึกลงฐานข้อมูล เป็นต้น








เนื้อหาที่เกี่ยวข้อง



Tags:: อ่านไฟล์ excel phpexcel excel csv




เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   



อย่าลืมกด Like กด Share เป็นกำลังใจ ในการสร้างบทความใหม่ๆ น่ะครับ


URL สำหรับอ้างอิง