1. 程式人生 > >PHPExcel將excel表的資料匯入資料庫

PHPExcel將excel表的資料匯入資料庫

一:話不多說,上乾貨

    1.首先,需要建立個數據庫 product

    資料庫程式碼參考:

/*
Navicat MySQL Data Transfer

Source Server         : TP-jifen-demo
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : product

Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001

Date: 2018-07-20 20:15:34
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `pro_info`
-- ----------------------------
DROP TABLE IF EXISTS `pro_info`;
CREATE TABLE `pro_info` (
  `pId` int(4) NOT NULL AUTO_INCREMENT,
  `pName` varchar(20) NOT NULL,
  `pPrice` float NOT NULL,
  `pCount` float NOT NULL,
  PRIMARY KEY (`pId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gb2312;

-- ----------------------------
-- Records of pro_info
-- ----------------------------

    2.整個excel備用,測試必備,大致這樣就可以

              

    3.建立專案demo,結構如下(紅框重點,Public資料夾下可能還需要個Uploads資料夾用來存放臨時檔案)

              

 

config.php:

<?php
return array(
	//'配置項'=>'配置值'
	'DB_TYPE'               =>  'mysql',     // 資料庫型別
    'DB_HOST'               =>  'localhost', // 伺服器地址
    'DB_NAME'               =>  'product',          // 資料庫名
    'DB_USER'               =>  'root',      // 使用者名稱
    'DB_PWD'                =>  '',          // 密碼。。
    'DB_PORT'               =>  '3306',        // 埠
    'DB_PREFIX'             =>  'pro_',    // 資料庫表字首
);

 

IndexController.class.php(有部分註釋為本人除錯時修改,請輕噴)

<?php

/**
 * @Author: ND01
 * @Date:   2018-07-19 16:13:25
 * @Last Modified by:   ND01
 * @Last Modified time: 2018-07-21 09:16:50
 */
/**
*
* 匯入Excel檔案資料到MySQL資料庫
*/
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
  
  /**
   * 顯示上傳表單html頁面
   */
  public function index() {
    $this->display();
  }
  
  /**
   * 上傳Excel檔案
   */
  public function upload() {
    //引入ThinkPHP上傳檔案類
    import('ORG.Net.UploadFile');
    $config = array(
        'exts' => array('xlsx','xls'),
        'maxSize' => 3145728000,
        'rootPath' =>"./Public/",
        'savePath' => 'Uploads/',
        'subName' => array('date','Ymd'),
      );
    //例項化上傳類
    $upload = new \Think\Upload($config);
    // dump($upload);die;
    //存在同名檔案是否是覆蓋
    $upload->uploadReplace = true;
    if (!$info = $upload->upload()) {  //如果上傳失敗,提示錯誤資訊
      $this->error($upload->getError());
    } else {  //上傳成功
      //獲取上傳檔案資訊
      // $info = $upload->upload();
      //獲取上傳儲存檔名
      $filename = $info['file']['savename'];
      $savepath = $info['file']['savepath'];
      // dump($filename);die;
      //重定向,把$fileName檔名傳給importExcel()方法
      // $this->success('Index/importExcel', array('filename' => $filename), 1, '上傳成功!');
    header("content-type:text/html;charset=utf-8");
    //引入PHPExcel類
    // vendor('PHPExcel');
    vendor("PHPExcel.PHPExcel");
    vendor('PHPExcel.IOFactory');
    vendor('PHPExcel.Reader.Excel5');
    // $info= $_GET['info'];dump($info);die;
    //redirect傳來的檔名
    // $filename = $_GET['filename'];
    // $filepath = $_GET['filepath'];
    // $info= $_GET['info'];dump($info);die;
    // dump($filename);die;
    
    //檔案路徑
    $filePath = './Public/' . $savepath. $filename ;
    // dump($savePath);die;
    //例項化PHPExcel類
    // $PHPExcel = new \Think\PHPExcel();
    //預設用excel2007讀取excel,若格式不對,則用之前的版本進行讀取
    $PHPReader = new \PHPExcel_Reader_Excel2007();
    if (!$PHPReader->canRead($filePath)) {
      $PHPReader = new \PHPExcel_Reader_Excel5();
      if (!$PHPReader->canRead($filePath)) {
        echo 'no Excel';
        return;
      }
    }
    // dump($PHPReader);die;
  
    //讀取Excel檔案
    $PHPExcel = $PHPReader->load($filePath);
    //讀取excel檔案中的第一個工作表
    $sheet = $PHPExcel->getSheet(0);
    //取得最大的列號
    $allColumn = $sheet->getHighestColumn();
    //取得最大的行號
    $allRow = $sheet->getHighestRow();
    //從第二行開始插入,第一行是列名
    for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
      //獲取B列的值
      $name = $PHPExcel->getActiveSheet()->getCell("B" . $currentRow)->getValue();
      //獲取C列的值
      $price = $PHPExcel->getActiveSheet()->getCell("C" . $currentRow)->getValue();
      //獲取D列的值
      $count = $PHPExcel->getActiveSheet()->getCell("D" . $currentRow)->getValue();
  
      $m = D('Info');
      $num = $m->add(array('pName' => $name, 'pPrice' => $price, 'pCount' => $count));
    }
    if ($num > 0) {
      echo "新增成功!";
    } else {
      echo "新增失敗!";
    }
    }
  }
  
  }
?>

 

index.html

 <!DOCTYPE html>
  
<html>
  <head>
    <title>上傳檔案</title>
    <meta charset="UTF-8">
  </head>
  <body>
    <form id="upload" action="__URL__/upload/" method="post" enctype="multipart/form-data">
      <label for="file">上傳檔案:</label>
      <input type="file" name="file" id="file"><br />
      <input type="submit" name="submit" value="上傳" />
    </form>
  </body>
</html>

   4.測試

 

二:總結

    文章說明:因學習時瀏覽網站較多且參考網站較多,如有參考內容轉載絕非有意,若有侵犯,還請告知。

    問題總結:學習過程中出現過很多問題。如找不到檔案的問題,嘗試多處使用dump來檢視變數值,保證程式碼走得通。

    多次出現The filename * is not readable錯誤,大致分為兩種問題,一種是路徑問題,一定要多檢查、修改、測試,另一種是檔案許可權問題,可以百度解決(註明一點,我的檔案只讀也取消不了,百度到的合理解釋為:https://baike.1688.com/doc/view-d26261162.html就是說並不影響)。

    注意PHPExcel外掛放於Vendor目錄下。

    文章若有錯誤或問題,歡迎指出。