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

เขียนเมื่อ 7 ปีก่อน โดย Ninenik Narkdee
อ่านไฟล์ excel csv excel phpexcel

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ อ่านไฟล์ excel csv excel phpexcel

ดูแล้ว 16,712 ครั้ง


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

 
ออกรายงานเป็น excel ไฟล์ด้วย PHPExcel ตอนเริ่มใช้ 

ไฟล์ excel ประกอบตัวอย่าง ดาวน์โหลดได้ที่  

 
ต่อไปให้เราสร้างไฟล์ทดสอบขึ้นมา ชื่อไฟล์ 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 ตัวอย่าง จะได้ดังนี้



 
 
ทีนี้เราจะมาประยุกต์ต่อจากโค้ดด้านบน โดยใช้ตัวอย่างไฟล์ 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 ของเรา

ดูผลลัพธ์ตัวอย่างจากโค้ดรูปแบบที่สอง ทดสอบกับไฟล์ 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 ตัวอย่าง จะได้ดังนี้



 
ทั้งหมดนี้เป็นแนวทางในการดึงข้อมูลจากไฟล์ excel หรือ csv ไฟล์ มาแสดง เราสามารถประยุกต์ต่อได้ เช่น
นำข้อมูลที่ได้ไปบันทึกลงฐานข้อมูล เป็นต้น


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







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






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

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




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





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ