TShopping

 找回密碼
 註冊
搜索
查看: 702|回復: 0
打印 上一主題 下一主題

[教學] 使用PhpSpreadsheet將Excel匯入的MySQL資料庫

[複製鏈接]
跳轉到指定樓層
1#
發表於 2023-5-15 22:58:25 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
日常開發中,我們經常遇到這樣的場景,需要將一個Excel表格資料如客戶資訊匯入到系統資料庫中,然後在系統中進行進一步操作,如給匯入的客戶群發短信

PHP匯入Excel避免了人工錄入資訊的麻煩和出錯,提高效率。

給大家講解使用PhpSpreadsheet將Excel匯入的MySQL資料庫。 準備 首先我們需要準備一張MySQL表,表名net_costomer,

接著,我們準備excel表格檔案,我特意製作了一個Excel檔案 aa.xlsx (8.66 KB, 下載次數: 14) : 然後將Excel檔案放置程式應用目錄下。當然,實際應用中,我們一般通過web上傳到伺服器指定目錄下,然後再進行匯入資料庫操作。


最後,你還需要安裝好PhpSpreadsheet,在前一節文章中有介紹,非常簡單: 使用PhpSpreadsheet讀取和寫入Excel 匯入Excel 準備工作做好後,我們來開始匯入。


思路很簡單:使用PhpSpreadsheet讀取Excel表格中的有用資訊,然後組裝成sql語句,最後批量插入到MySQL表中。我把程式碼貼出來。
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Excel匯入</title>
  6. <meta name="generator" content="NetYea! 1.32" />
  7. </head>
  8. <body>
  9. <?php
  10. include_once ('admin_global.php');
  11. $r=$db->Get_user_shell_check($uid, $shell);

  12. session_start();
  13. require 'vendor/autoload.php';

  14. use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
  15. use PhpOffice\PhpSpreadsheet\Reader\Xls;
  16. use PhpOffice\PhpSpreadsheet\IOFactory;
  17. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  18. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  19. use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
  20. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  21. use PhpOffice\PhpSpreadsheet\Style\Fill;
  22. use PhpOffice\PhpSpreadsheet\Style\Color;
  23. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  24. use PhpOffice\PhpSpreadsheet\Style\Border;
  25. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;

  26. if (isset($_POST["send"])) {
  27.         $leadExcel=$_POST["leadExcel"];
  28.         
  29.         if($leadExcel == "true"){
  30.                 $filePath = './import/';
  31.                 //獲取上傳的文件名
  32.                 $filename = $_FILES['inputExcel']['name'];
  33.                
  34.                 //上傳到服務器上的臨時文件名
  35.                 $tmp_name = $_FILES['inputExcel']['tmp_name'];
  36.                
  37.                 $filename=explode(".",$file);//把上傳的文件名以「.」好為準做一個數組。
  38.                 $time=date("y-m-d-H-i-s");//去當前上傳的時間
  39.                 $filename[0]=$time;//取文件名t替換
  40.                 $name=implode(".",$filename); //上傳後的文件名
  41.                 $uploadfile=$filePath.$name.".xlsx";//上傳後的文件名地址
  42.                 if(!move_uploaded_file($tmp_name ,$uploadfile)){
  43.                           die("該目錄無法寫入");
  44.                 }
  45.                 //move_uploaded_file() 函數將上傳的文件移動到新位置。若成功,則返回 true,否則返回 false。
  46.                 $result=move_uploaded_file($tmp_name ,$uploadfile);//假如上傳到當前目錄下
  47.                
  48.                 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
  49.                
  50.                 $reader->setReadDataOnly(TRUE);
  51.                
  52.                 $spreadsheet = $reader->load($uploadfile); //載入excel表格
  53.                 $worksheet = $spreadsheet->getActiveSheet();
  54.                 $highestRow = $worksheet->getHighestRow(); // 總行數
  55.                 $highestColumn = $worksheet->getHighestColumn(); // 總列數
  56.                 $highestColumnIndex = PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5
  57.                
  58.                 //循環讀取excel文件,讀取一條,插入一條
  59.                 for($j=1;$j<=$highestRow;$j++){
  60.                         for($k='A';$k<=$highestColumn;$k++){
  61.                                 $str .= $spreadsheet->getActiveSheet()->getCell("$k$j")->getValue().'\\';
  62.                                 //讀取單元格
  63.                         }
  64.                         //explode:函數把字符串分割為數組。
  65.                         //echo $highestRow."<br>".$highestColumn."<br>";
  66.                         //echo $str."<br>";
  67.                         $strs = explode("\\",$str);
  68.                         $id=$strs[0];
  69.                         $delivernum=$strs[1];
  70.                         $costomernum=sprintf("%06d",$strs[2]);
  71.                         $packages = $strs[3];
  72.                         $cmid = $strs[4];
  73.                         $name = $strs[5];
  74.                         $tel = $strs[6];
  75.                         $cell = $strs[7];
  76.                         $address = $strs[8];
  77.                         $total = $strs[9];
  78.                         $bonus = $strs[10];
  79.                         $spc = $strs[11];
  80.                         $slc = $strs[12];
  81.                         $deliverdate = $strs[13];
  82.                         $delivertime = $strs[14];
  83.                         $fuid = $strs[15];
  84.                         $suid = $strs[16];
  85.                         $fax = $strs[17];
  86.                         $close = $strs[18];
  87.                         if ($deliverdate == "") {
  88.                                 $deliverdate = mktime();
  89.                         } else {
  90.                                 list($y,$m,$J) = sscanf($deliverdate,"%d-%d-%d");
  91.                                 $deliverdate = mktime("0","0","0",$m,$J,$y);
  92.                         }
  93.                         $sql_check = "SELECT * FROM net_order WHERE delivernum='".$delivernum."'";
  94.                         $query_check = $db->query($sql_check);
  95.                         $row_check = mysqli_num_rows($query_check);
  96.                         if($row_check>=1)
  97.                                  echo "訂單編號:".$delivernum."重覆匯入..<br>";
  98.                         if ($delivernum!=""){
  99.                                 $sql = "INSERT INTO net_order(id,delivernum,costomernum,packages,cmid,name,tel,cell,address,total,bonus,spc,slc,deliverdate,delivertime,fuid,suid,fax,close,itemspc,itemslc,scolor,backordernum,levelc,faxdate,closedate,returns,returnsdate,packages_id)
  100.                                 VALUES('$id','$delivernum','$costomernum','$packages','$cmid','$name','$tel','$cell','$address','$total','$bonus','$spc','$slc','$deliverdate','$delivertime','$fuid','$suid','$fax','$close','0','0','0','0','0','0','0','0','0','0')";
  101.                                 echo "匯入".$sql."<br>";
  102.                                 if(!$db->query($sql)){
  103.                                         echo "匯入失敗,請洽程式管理員!";
  104.                                         return false;
  105.                                 }
  106.                         }
  107.                         $str = "";
  108.                 }
  109.         
  110.                 unlink($uploadfile); //刪除上傳的excel文件
  111.                 echo '<script>alert(\'匯入完成!\');window.location=\'excelintoorder.php\';</script>';
  112.         }else{
  113.                 echo '<script>alert(\'匯入失敗!\');window.location=\'excelintoorder.php\';</script>';
  114.         }
  115. }


  116. if (isset($_POST["clear"])) {
  117. $sql = "TRUNCATE TABLE net_mailuser";
  118. if(!$db->query($sql)){
  119. return false;
  120. }
  121. echo '<script>alert(\'電子報會員資料已清空!\');window.location=\'test1.php\';</script>';
  122. }
  123. ?>

  124. <form name="form2" method="post" action="<?php $_SERVER['PHP_SELF']?>" enctype="multipart/form-data">
  125. <input type="hidden" name="leadExcel" value="true">
  126. <table width="100%" border="1" cellpadding="0" cellspacing="0">
  127. <tr><td colspan="19">匯入訂單</td></tr>
  128. <tr><td colspan="19">EXCEL請按照下面格式匯入,不然會出錯!</td></tr>
  129. <tr><td>id</td><td>訂單編號</td><td>客戶編號</td><td>廠商包裝</td><td>客戶id</td><td>姓名</td><td>電話1</td><td>電話2</td><td>地址</td><td>總價</td><td>獎金</td><td>茶品品項</td><td>數量</td><td>送達日</td><td>送貨時段</td><td>開發業務</td><td>客服業務</td><td>傳真</td><td>結案</td></tr>
  130. </table>
  131. <br /><br />
  132. <table align="center" width="100%" border="0">
  133. <tr>
  134. <td>
  135. <input type="file" name="inputExcel"><input type="submit" value="上傳" name="send">
  136. </td>
  137. </tr>
  138. </table>
  139. </form>


  140. </body>
  141. </html>
複製代碼


範例圖:


$worksheet->getCellByColumnAndRow($col, $row)->getValue() 可以獲取表格中任意單元格資料內容, $col 表示單元格所在的列,以數字表示,A列表示第一列, $row 表示所在的行。
用雙迴圈匯入表格


當然你也可以逐條插入,但是效率沒有批量插入高。 最後執行匯入程式碼,你會發現資料表裏有資料了

參考文章https://itw01.com/FSYNSE2.html



 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-28 19:10 , Processed in 0.066138 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表