thinkphp5 使用PHPExcel 導入導出
阿新 • • 發佈:2017-12-08
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 導入導出