PhpSpreadsheet如何讀取excel文件


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

官方地址
github

安裝

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);
    }
}

 
參考:PhpSpreadsheet 讀取excel文件 - HD2killers的博客 - CSDN博客
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 }

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM