PhpSpreadsheet如何讀取excel文件
一、總結
一句話總結:萬能的百度,直接搜代碼就好,絕對有,畢竟github上面4000+的關注,說明很多人用了這個,使用照着demo倒是異常簡單
二、使用PhpSpreadsheet將Excel導入到MySQL數據庫
日常開發中,我們經常遇到這樣的場景,需要將一個Excel表格數據如客戶信息、學生成績表導入到系統數據庫中,然后在系統中進行進一步操作,如給導入的客戶群發短信,統計學生成績排名。PHP導入Excel避免了人工錄入信息的麻煩和出錯,提高效率。
本文以導入學生成績表為例,給大家講解使用PhpSpreadsheet將Excel導入的MySQL數據庫。
准備
首先我們需要准備一張MySQL表,表名t_student,表結構如下:
CREATE TABLE `t_student` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL COMMENT '姓名', `chinese` int(6) NOT NULL DEFAULT '0' COMMENT '語文', `maths` int(6) NOT NULL DEFAULT '0' COMMENT '數學', `english` int(6) NOT NULL DEFAULT '0' COMMENT '外語', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
這是一張學生成績表,用來存儲學生的姓名和語數外三門課程的成績。
接着,我們准備excel表格文件,我特意制作了一個Excel文件students.xlsx:
然后將Excel文件放置程序應用目錄下。當然,實際應用中,我們一般通過web上傳到服務器指定目錄下,然后再進行導入數據庫操作。本文web上傳這塊就不涉及了,感興趣的同學可以參考本站文章:Dropzone.js實現文件拖拽上傳,功能強大的文件上傳組件-WebUploader。
最后,你還需要安裝好PhpSpreadsheet,在前一節文章中有介紹,非常簡單:使用PhpSpreadsheet讀取和寫入Excel
導入Excel
准備工作做好后,我們來開始導入。
思路很簡單:使用PhpSpreadsheet讀取Excel表格中的有用信息,然后組裝成sql語句,最后批量插入到MySQL表中。我把代碼貼出來。
require 'vendor/autoload.php'; include('conn.php'); //連接數據庫 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); $reader->setReadDataOnly(TRUE); $spreadsheet = $reader->load('students.xlsx'); //載入excel表格 $worksheet = $spreadsheet->getActiveSheet(); $highestRow = $worksheet->getHighestRow(); // 總行數 $highestColumn = $worksheet->getHighestColumn(); // 總列數 $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5 $lines = $highestRow - 2; if ($lines <= 0) { exit('Excel表格中沒有數據'); } $sql = "INSERT INTO `t_student` (`name`, `chinese`, `maths`, `english`) VALUES "; for ($row = 3; $row <= $highestRow; ++$row) { $name = $worksheet->getCellByColumnAndRow(1, $row)->getValue(); //姓名 $chinese = $worksheet->getCellByColumnAndRow(2, $row)->getValue(); //語文 $maths = $worksheet->getCellByColumnAndRow(3, $row)->getValue(); //數學 $english = $worksheet->getCellByColumnAndRow(4, $row)->getValue(); //外語 $sql .= "('$name','$chinese','$maths','$english'),"; } $sql = rtrim($sql, ","); //去掉最后一個,號 try { $db->query($sql); echo 'OK'; } catch (Exception $e) { echo $e->getMessage(); }
$worksheet->getCellByColumnAndRow($col, $row)->getValue()
可以獲取表格中任意單元格數據內容,$col
表示單元格所在的列,以數字表示,A列表示第一列,$row
表示所在的行。
我們只需要第三行以后的數據,因此直接從第三行開始循環遍歷,獲取成績,組裝成SQL語句。
我們使用批量插入MySQL語句,當然你也可以逐條插入,但是效率沒有批量插入高。
最后執行導入代碼,你會發現數據表里有數據了:
MariaDB [demo]> select * from t_student;
+----+-----------+---------+-------+---------+
| id | name | chinese | maths | english | +----+-----------+---------+-------+---------+ | 13 | 王二小 | 82 | 78 | 65 | | 14 | 李萬豪 | 68 | 87 | 79 | | 15 | 張三豐 | 89 | 90 | 98 | | 16 | 王老五 | 68 | 81 | 72 | +----+-----------+---------+-------+---------+ 4 rows in set (0.00 sec)
參考:使用PhpSpreadsheet將Excel導入到MySQL數據庫_Helloweba
https://www.helloweba.net/php/562.html
三、PhpSpreadsheet 讀取excel文件
phpexcel不再維護,使用PhpSpreadsheet
安裝
composer require phpoffice/phpspreadsheet
例子
class Vcard {
public function index() {
$file_name = "1";
$uploadwork = "C:\Users\Administrator\Desktop\城市\二線城市(30個)27575條\\";
$uploadfile = $uploadwork.$file_name.'.xlsx';
$reader = \PHPExcel_IOFactory::createReader('excel2007'); //設置以Excel5格式(Excel97-2003工作簿)
$PHPExcel = $reader->load($uploadfile); // 載入excel文件
$sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表
$highestRow = $sheet->getHighestRow(); // 取得總行數
$highestColumm = $sheet->getHighestColumn(); // 取得總列數
$data = [];
for ($row = 2; $row <= $highestRow; $row++) //行號從1開始
{
for ($column = 'A'; $column <= $highestColumm; $column++) //列數是以A列開始
{
if (empty($sheet->getCell($column . $row)->getValue()) == false) {
if (empty($data[$row]) == false) {
$str = $sheet->getCell($column . $row)->getValue();
if (strlen($str)>11) {
$pieces = explode("|", $str);
$data[$row]['mobile'] = $pieces[0];
}else{
$data[$row]['mobile'] = $str;
}
} else {
$data[$row]['name'] = $sheet->getCell($column . $row)->getValue();
}
}
}
}
// dump($data);
$myfile = fopen($uploadwork.$file_name.".vcf", "w") or die("Unable to open file!");
foreach ($data as $key => $value) {
$all_str = $this->make_vcard($value['name'], $value['mobile']);
fwrite($myfile, $all_str);
}
fclose($myfile);
}
}
https://blog.csdn.net/HD2killers/article/details/80826981
四、自己phpSpreadsheet讀寫excel實例代碼(親測可用)
write函數功能:測試write內容到excel
read函數功能:將用戶數據從excel中取出來,然后實現批量生成用戶賬號
讀入數據樣例:
1 <?php 2 namespace app\admin\controller\test\phpspreadsheet; 3 4 use app\admin\controller\Base; 5 6 use PhpOffice\PhpSpreadsheet\Reader\Xls\MD5; 7 use PhpOffice\PhpSpreadsheet\Spreadsheet; 8 //use PhpOffice\PhpSpreadsheet\Writer\Xlsx; 9 use PhpOffice\PhpSpreadsheet\Reader\Xlsx; 10 11 class Index extends Base 12 { 13 public function write() 14 { 15 $spreadsheet = new Spreadsheet(); 16 $sheet = $spreadsheet->getActiveSheet(); 17 $sheet->setCellValue('A1', 'Hello World !'); 18 19 $writer = new Xlsx($spreadsheet); 20 $writer->save('d://hello.xlsx'); 21 //dump('2222222222');die; 22 //return view(); 23 } 24 25 public function read(){ 26 $file_name = "D"; 27 $uploadwork = "d://"; 28 $uploadfile = $uploadwork.$file_name.'.xlsx'; 29 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); //設置以Excel5格式(Excel97-2003工作簿) 30 $PHPExcel = $reader->load($uploadfile); // 載入excel文件 31 $sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表 32 $highestRow = $sheet->getHighestRow(); // 取得總行數 33 $highestColumm = $sheet->getHighestColumn(); // 取得總列數 34 $data = []; 35 for ($row = 4; $row <= $highestRow; $row++) //行號從1開始 36 { 37 for ($column = 'A'; $column <= $highestColumm; $column++) //列數是以A列開始 38 { 39 if (empty($sheet->getCell($column . $row)->getValue()) == false) { 40 $data[$row][$column]=$sheet->getCell($column . $row)->getValue(); 41 } 42 } 43 if(!isset($data[$row]['B'])) unset($data[$row]); 44 } 45 46 dump($data); 47 48 //班級和文件信息 49 $fileAndClass=[ 50 'A'=>17, 51 'B'=>18, 52 'C'=>19, 53 'D'=>20, 54 ]; 55 56 //組裝用戶信息 57 $userArr=null; 58 foreach ($data as $key=>$val){ 59 $perUser=null; 60 $perUser['u_picture']='/static/student/img/a4.png'; 61 $perUser['u_gender']=0; 62 $perUser['u_name']=$val['D'].'-'.$val['E']; 63 $perUser['u_username']=$val['G'].'_'.strtolower($val['B']); 64 $perUser['u_password']=md5($perUser['u_username']); 65 $perUser['u_class']=$fileAndClass[$file_name]; 66 67 //如果是女性,更改性別和默認圖片 68 if(strtolower($val['F'])=='f'){ 69 $perUser['u_picture']='/static/student/img/a2.png'; 70 $perUser['u_gender']=1; 71 } 72 $userArr[]=$perUser; 73 } 74 $ans=db('user')->insertAll($userArr); 75 dump($ans); 76 dump($userArr);die; 77 78 79 } 80 }