1. 程式人生 > >thinkphp5 使用PHPExcel 導入導出

thinkphp5 使用PHPExcel 導入導出

demo sel mes cati val llb nand ++ array類

首先下載PHPExcel類。網上很多,自行下載。

然後把文件放到vendor文件裏面。

一般引用vendor裏面的類或者插件用vendor();

裏面加載的就是vendor文件,然後想要加載哪個文件,直接寫就行,中間的“.”相當於文件路徑的“/”。

例如加載excel5這個文件:

技術分享圖片

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

    <form enctype="multipart/form-data" method="post" id="form-admin-role-add">
        <div class="form-group col-sm-2">
            <
input type="file" name="file_stu" /> </div> <div class="form-group col-sm-2"> <input type="submit" value="導入" class="btn btn-w-m btn-primary btn-outline" /> </div> </form> <div class="form-group col-sm-2"> <a class
="btn btn-w-m btn-primary btn-outline" href="{:url(‘EquipmentList/out‘)}">下載excel表格</a> </div>

這裏有個要註意的地方,我導入是做了異步的,導出不能做異步。

然後先放導入的方法吧:

//導入Excel
    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 . ‘uploads‘ . 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/think/ExcelToArrary.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][‘pname‘] = $v[0]; $data[$k][‘access‘] = $v[1]; $data[$k][‘jointime‘] = time(); } } //插入的操作最好放在循環外面 $result = model(‘ProductAccess‘)->insertAll($data); if($result){ return [‘state‘=>true, ‘msg‘=>‘導入成功‘]; }else{ return [‘state‘=>false, ‘msg‘=>‘導入失敗‘]; } } }

這裏面有要引入ExcelToArray,代碼如下:

<?php
namespace think;

use PHPExcel_IOFactory;
use PHPExcel_Cell;
use PHPExcel;
/** 
 * 讀取Excel數據
 */
class ExcelToArrary
{
    public function __construct() {
        //這些文件需要下載phpexcel,然後放在vendor文件裏面。具體參考上一篇數據導出。
        vendor("PHPExcel.PHPExcel.PHPExcel");
        vendor("PHPExcel.PHPExcel.Writer.IWriter");
        vendor("PHPExcel.PHPExcel.Writer.Abstract");
        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;
    }

}

只要類都引入成功了,代碼直接貼上去就能用了

技術分享圖片

這裏改成你自己的。導入就完成啦。

然後就是導出。

//導出Excel
    public function out()
    {
        
        //導出
        $path = dirname(__FILE__); //找到當前腳本所在路徑
        vendor("PHPExcel.PHPExcel.PHPExcel");
        vendor("PHPExcel.PHPExcel.Writer.IWriter");
        vendor("PHPExcel.PHPExcel.Writer.Abstract");
        vendor("PHPExcel.PHPExcel.Writer.Excel5");
        vendor("PHPExcel.PHPExcel.Writer.Excel2007");
        vendor("PHPExcel.PHPExcel.IOFactory");
        $objPHPExcel = new \PHPExcel();
        $objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);
        $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);


        // 實例化完了之後就先把數據庫裏面的數據查出來
        $sql = model(‘ProductAccess‘)->select();

        // 設置表頭信息
        $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue(‘A1‘, ‘機型‘)
        ->setCellValue(‘B1‘, ‘機型編號‘)
        ->setCellValue(‘C1‘, ‘生產日期‘);

        /*--------------開始從數據庫提取信息插入Excel表中------------------*/

        $i=2;  //定義一個i變量,目的是在循環輸出數據是控制行數
        $count = count($sql);  //計算有多少條數據
        for ($i = 2; $i <= $count+1; $i++) {
            $objPHPExcel->getActiveSheet()->setCellValue(‘A‘ . $i, $sql[$i-2][‘pname‘]);
            $objPHPExcel->getActiveSheet()->setCellValue(‘B‘ . $i, $sql[$i-2][‘access‘]);
            $objPHPExcel->getActiveSheet()->setCellValue(‘C‘ . $i, $sql[$i-2][‘jointime‘]);
        }

        
        /*--------------下面是設置其他信息------------------*/

        $objPHPExcel->getActiveSheet()->setTitle(‘productaccess‘);      //設置sheet的名稱
        $objPHPExcel->setActiveSheetIndex(0);                   //設置sheet的起始位置
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel5‘);   //通過PHPExcel_IOFactory的寫函數將上面數據寫出來
        
        $PHPWriter = \PHPExcel_IOFactory::createWriter( $objPHPExcel,"Excel2007");
            
        header(‘Content-Disposition: attachment;filename="設備列表.xlsx"‘);
        header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet‘);
        
        $PHPWriter->save("php://output"); //表示在$path路徑下面生成demo.xlsx文件
        
    }

技術分享圖片

這部分相應改成自己的就成了。

我做這個,遇到的問題也基本就是類引入不成功。只要都引入成功了。就改相應代碼就OK了。

thinkphp5 使用PHPExcel 導入導出