天天看點

ThinkPHP5.0 使用phpexcel導入資料庫

先把html代碼貼出來(整個導入導出的):

<form action="ADMIN_MAIN/Excel/into" enctype="multipart/form-data" method="post">
    <input  type="file" name="file_stu" />
    <input type="submit"  value="導入" />
</form>

<form action="ADMIN_MAIN/Excel/out" enctype="multipart/form-data" method="post">
    <input type="submit" value="導出">
</form>

           

導入的方法:

網上試了好多方法,不是找不到update類就是引入某些檔案引入不進來。然後東拼西湊的寫法,解決了以上問題。需要用到一個ExcelToArrary.class.php這樣的檔案。(後面附上檔案 以及詳細說明)裡面的方法一般除了vendor引用的檔案根據自己目錄可能需要更改一下以外,其餘的基本上不用改動的。

public function into()
    {
        if (!empty ($_FILES ['file_stu'] ['name'])) {
            $tmp_file = $_FILES ['file_stu'] ['tmp_name'];
            $file_types = explode(".", $_FILES ['file_stu'] ['name']);
            $file_type = $file_types [count($file_types) - 1];
            /*判别是不是.xls檔案,判别是不是excel檔案*/
            if (strtolower($file_type) != "xlsx") {
                $this->error('不是Excel檔案,重新上傳');
            }
            /*設定上傳路徑*/
            /*百度有些文章寫的上傳路徑經過編譯之後斜杠不對。不對的時候用大寫的DS代替,然後用連接配接符連結就可以拼湊路徑了。*/
            $savePath = ROOT_PATH . 'public' . DS . 'upload' . DS;

            /*以時間來命名上傳的檔案*/
            $str = date('Ymdhis');
            $file_name = $str . "." . $file_type;
            /*是否上傳成功*/
            if (!copy($tmp_file, $savePath . $file_name)) {
                $this->error('上傳失敗');
            }
            /*
            *對上傳的Excel資料進行處理生成程式設計資料,這個函數會在下面第三步的ExcelToArray類中
            *注意:這裡調用執行了第三步類裡面的read函數,把Excel轉化為數組并傳回給$res,再進行資料庫寫入
            */
            require THINK_PATH.'Library/Org1/Util/ExcelToArrary.class.php';//導入excelToArray類
          //引入這個類試了百度出來的好幾個方法都不行。最後簡單粗暴的使用了require方式。這個類想放在哪裡放在哪裡。隻要路徑對就行。
            $ExcelToArrary=new \ExcelToArrary();//執行個體化

            $res=$ExcelToArrary->read($savePath.$file_name,"UTF-8",$file_type);//傳參,判斷office2007還是office2003

            /*對生成的數組進行資料庫的寫入*/
            foreach ($res as $k => $v) {
                if ($k > 1) {
                    $data[$k]['username'] = $v[1];
                    $data[$k]['phone'] = $v[2];
//                    $data ['password'] = sha1('111111');
                }
            }
            //插入的操作最好放在循環外面
            $result = db('sys_ceshi')->insertAll($data);
            //var_dump($result);
        }
    }
           

ExcelToArrary.class.php

<?php
/** 
 * 讀取Excel資料
 */
class ExcelToArrary {
    public function __construct() {
        //這些檔案需要下載下傳phpexcel,然後放在vendor檔案裡面。具體參考上一篇資料導出。
        vendor("PHPExcel.PHPExcel.PHPExcel");
        vendor("PHPExcel.PHPExcel.Writer.Excel5");
        vendor("PHPExcel.PHPExcel.Writer.Excel2007");
        vendor("PHPExcel.PHPExcel.IOFactory");
    }
    public function read($filename,$encode,$file_type){
            if(strtolower ( $file_type )=='xls')//判斷excel表類型為2003還是2007
            {
                Vendor("Excel.PHPExcel.Reader.Excel5"); 
                $objReader = PHPExcel_IOFactory::createReader('Excel5');
                $objReader = PHPExcel_IOFactory::createReader('Excel5');

            }elseif(strtolower ( $file_type )=='xlsx')
            {
                Vendor("Excel.PHPExcel.Reader.Excel2007"); 
                $objReader = PHPExcel_IOFactory::createReader('Excel2007');
            }
            $objReader->setReadDataOnly(true);
            $objPHPExcel = $objReader->load($filename);
            $objWorksheet = $objPHPExcel->getActiveSheet();
            $highestRow = $objWorksheet->getHighestRow();
            $highestColumn = $objWorksheet->getHighestColumn();
            $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
            $excelData = array();
            for ($row = 1; $row <= $highestRow; $row++) {
                for ($col = 0; $col < $highestColumnIndex; $col++) {
                    $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
                    }
            }
            return $excelData;
    }
}