Hướng dẫn đọc và ghi file excel bằng PHP
Trong bất kì một ứng dụng PHP nào, chúng ta cũng cần phải có ít nhất một lần đụng tới việc trích xuất dữ liệu hoặc đọc dữ liệu từ file excel, chẳng hạn như báo cáo doanh thu bán hàng, ngân hàng, danh sách nhân viên, danh sách khách hàng,… Rất rất nhiều thứ phải cần đến đến việc đọc và ghi file excel bằng PHP.
Do đó, trong bài viết ngày hôm nay, mình sẽ hướng dẫn các bạn làm được điều này, bằng cách sử dụng thư viện hỗ trợ điều này, thư viện có tên PHPExcel. Đây là một thư viện hỗ trợ đọc và ghi file excel cực kì tốt và sử dụng rộng rãi
Đọc và ghi file excel bằng PHPExcel
1. Download thư viện PHPExcel
Để có thể đọc và ghi file excel, thì bạn cần phải download thư viện PHPExcel về tại đây :
https://github.com/PHPOffice/PHPExcel
Vào link trên, bên góc phải bạn sẽ thấy một nút màu xanh lá tên là Clone or Download. Click vào, rồi chọn Download zip. Sau đó, giải nén file zip ra và copy thư mục Classes cho vào thư mục gốc chứa ứng dụng web . Như vậy là chúng ta đã xong phần download thư viện PHPExcel, tiếp đến chúng ta sẽ tiến hành đọc và ghi file excel.
2. Đọc file excel
Đọc file excel chính là cách chúng ta load 1 file excel bên trong có chứa dữ liệu, rồi tiến hành trích xuất ra dữ liệu từ trong file này để dùng cho một mục đích nào đó tùy theo yêu cầu của hệ thống.
Các bạn download file mẫu excel tên là product.xlsx mà mình đã tạo sẵn, có nội dung hình dưới và đặt nó nằm cùng cấp với thư mục Classes:

Tiếp theo, bạn sẽ tiến hành đọc file này bằng cách tạo thêm 1 file mới tên là docfile.php cùng cấp với thư mục Classes, và gõ theo nội dung bên dưới:
<?php
// Include thư viện PHPExcel_IOFactory vào
include 'Classes/PHPExcel/IOFactory.php';
$inputFileName = 'product.xlsx';
// Tiến hành đọc file excel
try {
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
} catch(Exception $e) {
die('Lỗi không thể đọc file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
}
// Lấy thông tin cơ bản của file excel
// Lấy sheet hiện tại
$sheet = $objPHPExcel->getSheet(0);
// Lấy tổng số dòng của file, trong trường hợp này là 6 dòng
$highestRow = $sheet->getHighestRow();
// Lấy tổng số cột của file, trong trường hợp này là 4 dòng
$highestColumn = $sheet->getHighestColumn();
// Khai báo mảng $rowData chứa dữ liệu
// Thực hiện việc lặp qua từng dòng của file, để lấy thông tin
for ($row = 1; $row <= $highestRow; $row++){
// Lấy dữ liệu từng dòng và đưa vào mảng $rowData
$rowData[] = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE,FALSE);
}
//In dữ liệu của mảng
echo "<pre>";
print_r($rowData);
echo "</pre>";
Tất cả từng dòng code mình đều có chú thích, bạn nên vừa đọc code vừa đọc chú thích comment để hiểu nhé. Tiếp theo bạn tiến hành thực thi file docfile.php này, sẽ thấy kết quả in ra màng hình là một mảng chứa tất cả thông tin của file excel product.xlsx.
Array
(
[0] => Array
(
[0] => Array
(
[0] => STT
[1] => product_name
[2] => quantity
[3] => price
)
)
[1] => Array
(
[0] => Array
(
[0] => 1
[1] => php ebook
[2] => 2
[3] => 100
)
)
[2] => Array
(
[0] => Array
(
[0] => 2
[1] => java ebook
[2] => 1
[3] => 50
)
)
[3] => Array
(
[0] => Array
(
[0] => 3
[1] => laravel 5
[2] => 3
[3] => 120
)
)
[4] => Array
(
[0] => Array
(
[0] => 4
[1] => angularjs
[2] => 5
[3] => 30
)
)
[5] => Array
(
[0] => Array
(
[0] => 5
[1] => python
[2] => 4
[3] => 60
)
)
)
từ đó bạn có thể sử dụng mảng này cho mục đích thích hợp của bạn, như lưu vào cơ sở dữ liệu chẳng hạn.
3. Ghi dữ liệu ra file excel
Tương tự như file excel, chúng ta sẽ tiếp tục dùng thư viện PHPExcel để ghi dữ liệu ra file.
Đầu tiên, các bạn tạo 1 file mới, đặt tên là ghifile.php và 1 file tên là product_import.xlsx (file này tạo ra và để trống, ko cần điền nội dung, vì chúng ta sẽ điền nội dung vào bằng thư viện PHPExcel) và đặt 2 file này cùng cấp với file docfile.php. Các bạn mở file docfile.php lên và gõ nội dung như sau :
<?php
// Include thư viện PHPExcel_IOFactory vào
include 'Classes/PHPExcel/IOFactory.php';
// Loại file cần ghi là file excel phiên bản 2007 trở đi
$fileType = 'Excel2007';
// Tên file cần ghi
$fileName = 'product_import.xlsx';
// Load file product_import.xlsx lên để tiến hành ghi file
$objPHPExcel = PHPExcel_IOFactory::load("product_import.xlsx");
// Giả sử chúng ta có mảng dữ liệu cần ghi như sau
$array_data = array(
0 => array('name' => 'Hieu', 'email' => 'hieu@gmail.com', 'phone' => '0123456789', 'address' => 'address 1'),
1 => array('name' => 'Nam', 'email' => 'nam@gmail.com', 'phone' => '0124567892', 'address' => 'address 2'),
2 => array('name' => 'Tuan', 'email' => 'tuan@gmail.com', 'phone' => '09764346789', 'address' => 'address 3'),
3 => array('name' => 'Mai', 'email' => 'mai@gmail.com', 'phone' => '09876543356', 'address' => 'address 4'),
4 => array('name' => 'Thao', 'email' => 'thao@gmail.com', 'phone' => '0975458979', 'address' => 'address 5'),
);
// Thiết lập tên các cột dữ liệu
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', "STT")
->setCellValue('B1', "Name")
->setCellValue('C1', "Email")
->setCellValue('D1', "Phone")
->setCellValue('E1', "Address");
// Lặp qua các dòng dữ liệu trong mảng $array_data và tiến hành ghi dữ liệu vào file excel
$i = 2;
foreach ($array_data as $value) {
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue("A$i", "$i")
->setCellValue("B$i", $value['name'])
->setCellValue("C$i", $value['email'])
->setCellValue("D$i", $value['phone'])
->setCellValue("E$i", $value['address']);
$i++;
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $fileType);
// Tiến hành ghi file
$objWriter->save($fileName);
Cuối cùng chạy file ghifile.php và mở file product_import.xlsx lên, các bạn sẽ thấy dữ liệu đã được ghi vào bao gồm 5 dòng tương ứng số dòng dữ liệu trong array $array_data nhé.

Gợi ý: Bạn đang quan tâm đến Bitcoin? Tìm hiểu ngay Bitcoin Toàn Tập Cho Người Mới nhé!
Như vậy, mình đã giới thiệu các bạn cách để đọc và ghi file excel bằng thư viện PHPExcel. Có bất kỳ thắc mắc nào hãy để lại comment bên dưới nhé. Đừng quên đăng ký nhận bài viết ở thanh sidebar bên phải để cập nhật các bài viết mới nhất từ trang.
Có thể tham khảo thêm bài viết về xử lý file text tại đây
Chúc các bạn học tốt !


Bnaj ơi cho mình hỏi với mình đọc file báo lỗi
Lỗi không thể đọc file “abc.xlsx”: Could not open https://abc.com/wp-content/uploads/2023/07/abc.xlsx for reading! File does not exist.
Mặc dù file đó mình vào vẫn có file đó copy nguyên link vẫn ra file
bạn kiểm tra quyền của folder chưa file xem, thử chỉnh 777 xem sao
Thầy ơi! em làm theo hướng dẫn nhưng khi chạy file docfile.php máy báo lỗi: Fatal error: Array and string offset access syntax with curly braces is no longer supported in C:\xampp\htdocs\db1656\Classes\PHPExcel\Shared\String.php on line 526 là lỗi gì ạ. Thầy hướng dẫn giúp em với ạ. Thanks thầy
mình bị lỗi các ô dữ liệu sử dụng hàm vlookup, có cách nào lấy text từ các ô đó ra ko nhỉ?
bạn cho mình hỏi tên SHEET Của mình đã được đổi rồi thì làm sao mình có thể đọc được SHEET đó
Tên sheet đổi cũng đâu ảnh hưởng gì đâu bạn, bạn lấy theo chỉ số cột là 0,1,2,3 mà
Cái đó mình làm đc rồi tks bạn. Mà mình bị lỗi hiển thị tiếng việt khi đọc nội dung từ trong file excel ra. Bạn có cách nào giải quyết ko giúp mình với
bạn có thể thêm đoạn này vào trước code hiển thị ra ngoài nhé : header(‘Content-Type: text/html; charset=utf-8’);
Sao ko được bạn ơi hjx mình vẫn thấy bị lỗi hiển thị
Bạn ơi khi mình chuyển qua định dạng Json_encode thì nó bị lỗi hiển thị. có cách nào khắc phục không bạn
Bạn ơi cho mình hỏi, do bảng dữ liệu của mình chưa biết trước được số cột cần hiện thị(nếu biết trước các cootjj xuất ra là A, B, C, D thì ok rồi), tuy nhiên trường hợp của mình số cột xuất ra không cố định(do người dùng tích chọn) vậy phải làm thế nào? Xin cảm ơn!
khi người dùng tick chọn thì bạn đã biết được những cột nào đã tick rồi thì bạn cứ lấy những cột đã chọn đó và truy xuất ra bình thường mà ?
Vấn đề là xuất ra những cột nào trong excel, vì mẫu excel trong trường hợp này ko fix đc những cột nào cả
Chẳng hạn ở đây khách hàng tick chọn một cột nào đó, thì e sẽ lưu những cột đã được chọn vào một mảng, từ đó e duyệt mảng này e sẽ biết được những cột nào cần lấy ra dữ liệu, từ đó e sử dụng các cột này để làm khóa đọc dữ liệu từ file excel là được. Vì a ko nắm được chính xác nghiệp vụ của e như nào nhưng theo như mô tả của e là zậy
Cho mình hỏi xuất ra để hiển thị được tiếng việt thì làm sao ?
Tiếng anh thì ok nhưng tiếng việt lại bị mất dấu.
thử dùng hàm http://php.net/manual/en/function.mb-convert-encoding.php
Bạn ơi cho mình hỏi, do bảng dữ liệu của mình có 1 trường số (6000005600007850) khi xuất ra file excel bị lỗi (6.00001E+15) –> hiển thị không đầy đủ, bạn cho mình hỏi có cách nào để hiển thị đủ không? Xin cảm ơn
Sử dụng cái này nhé : $objPHPExcel->getActiveSheet()->setCellValueExplicit(‘A1’, ‘6000005600007850’, PHPExcel_Cell_DataType::TYPE_STRING);
Cảm ơn bạn, mình đã làm được rồi. Thanks
Ko có chi bạn