PhpSpreadsheet是PHPExcel的下一個版本。它打破了兼容性,大大提高了代碼庫質量(命名空間,PSR合規性,最新PHP語言功能的使用等)。
由於所有努力都轉移到了PhpSpreadsheet,因此將不再維護PHPExcel。PHPExcel,補丁和新功能的所有貢獻都應該針對PhpSpreadsheet開發分支。
說明:由於PHPExcel已更名phpspreadsheet,PHPExcel已不再更新,兼容新版本PHP會存在某些問題,建議升級到PHPSpreadsheet。
PHPExcel已經被廢棄在PHP7.2中已經無法獲取更新,官方重新開了一個新包phpspreadsheet
環境及版本:ThinkPHP5.1.24、PHP7.2.8、Nginx1.15.3
功能實現:使用phpspreadsheet導出Excel、導入Excel返回數組數據
安裝說明:請先使用composer安裝依賴:composer install
在線地址:http://demo.linzening.club/
Git地址:https://gitee.com/linzening/newthink
重要的事情說N遍,建議使用 phpspreadsheet
composer安裝
composer require phpoffice/phpspreadsheet
安裝好之后
<!-- Excle導入 開始 --> <form action="/admin/market/csj_upExcle" method="post" enctype="multipart/form-data" class="layui-form layui-form-pane form-search dd1"> <div class="layui-form-item layui-inline"> <label class="layui-form-label">導入文件</label> <div class="layui-input-inline" style="width: 160px;"> <input name="csjexclefile" class="layui-input" type="file"> </div> <input type="hidden" name="now_time" class="csj_date" value=""><div class="layui-input-inline" style="width: 100px;"> <input class="layui-input csjSubmit" type="submit" value="上傳" style="width: 55px;"> </div></div> </form>
只需要看form表單中input-name即可,其他的是 layui 不用管,提交表單之后 后台
<?php namespace app\admin\controller; use controller\BasicAdmin;use think\Db;use PHPExcel_IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; use think\Loader; use service\AliyunLogService; /** * 大盤總覽 * Class Market * @package app\admin\controller */ class Index extends BasicAdmin {public function csj_upExcle() { header("content-type:text/html;charset=utf-8"); $file = request()->file('csjexclefile'); //將文件保存到public/uploads目錄下面 $info = $file->move('./uploads'); if ($info) { //獲取上傳到后台的文件名 $fileName = $info->getSaveName(); //獲取文件路徑. $filePath =__DIR__."/../../../uploads" . DIRECTORY_SEPARATOR . $fileName; //獲取文件后綴 $suffix = $info->getExtension(); // 有Xls和Xlsx和Cvs格式三種 if ($suffix=="xls") { $reader = IOFactory::createReader('Xls'); }elseif ($suffix=="xlsx") { $reader = IOFactory::createReader('Xlsx'); }elseif ($suffix=="csv") { $reader = IOFactory::createReader('Csv'); } } else { return "<script>alert('文件過大或格式不正確導致上傳失敗-_-!');window.history.back(-1);</script>"; } //如果是cvs文件則不走PhpSpreadsheet if ($suffix=="csv") { $handle = fopen($filePath,'r'); if (!$handle) { return "<script>alert('讀取文件失敗-_-!');window.history.back(-1);</script>"; } //不取第一個集合(第一個集合是主題) $j = 0; //新數組下標從0開始 $k = 0; $new_insert_data = []; while(($data = fgetcsv($handle)) !== false) { for ($i = 0; $i < count($data); $i++) { $data[$i] = iconv('gbk', 'utf-8', $data[$i]); } if ($j>0) { if (in_array($data[1],$gameArr)) { $new_insert_data[$k]['game_name'] = $data[1]; $new_insert_data[$k]['date'] = date("Y-m-d",strtotime($data[0])); $new_insert_data[$k]['channel'] = $data[2]; $new_insert_data[$k]['c_income'] = $data[3]; $new_insert_data[$k]['c_impel_income'] = $data[4]; $new_insert_data[$k]['c_information_income'] = $data[5]; $new_insert_data[$k]['c_all_video_income'] = $data[6]; $new_insert_data[$k]['c_start_video_income'] = $data[7]; $new_insert_data[$k]['c_insert_video_income'] = $data[8]; $new_insert_data[$k]['c_banner_income'] = $data[9];$k++; } } $j++; } }else{ //載入excel文件 $excel = $reader->load($filePath); //讀取第一張表 $sheet = $excel->getSheet(0); //var_dump($sheet);die(); //獲取總行數 $row_num = $sheet->getHighestRow(); //獲取總列數 $col_num = $sheet->getHighestColumn(); $insert_data = []; for ($i = 2; $i <= $row_num; $i++) { $game_name = $excel->getActiveSheet()->getCell("B" . $i)->getValue(); if (in_array($game_name,$gameArr)) {$insert_data[$i]['date'] = gmdate('Y-m-d',intval(($excel->getActiveSheet()->getCell("A" . $i)->getValue() - 25569) * 3600 * 24)); $insert_data[$i]['game'] = $excel->getActiveSheet()->getCell("B" . $i)->getValue(); $insert_data[$i]['chel'] = $excel->getActiveSheet()->getCell("C" . $i)->getValue(); $insert_data[$i]['c_me'] = $excel->getActiveSheet()->getCell("D" . $i)->getValue(); $insert_data[$i]['c_icome'] = $excel->getActiveSheet()->getCell("E" . $i)->getValue(); $insert_data[$i]['c_inincome'] = $excel->getActiveSheet()->getCell("F" . $i)->getValue(); $insert_data[$i]['c_alincome'] = $excel->getActiveSheet()->getCell("G" . $i)->getValue(); $insert_data[$i]['c_stacome'] = $excel->getActiveSheet()->getCell("H" . $i)->getValue(); $insert_data[$i]['c_ins_income'] = $excel->getActiveSheet()->getCell("I" . $i)->getValue(); $insert_data[$i]['c_e'] = $excel->getActiveSheet()->getCell("J" . $i)->getValue(); $insert_data[$i]['c_come'] = $excel->getActiveSheet()->getCell("K" . $i)->getValue(); } } if (empty($insert_data)) { return "<script>alert('數據解析失敗,請檢查Excle序列號是否連續/聯系管理員!');window.history.back(-1);</script>"; } $new_insert_data = array_values($insert_data); }
//入庫就好了 $res = $this->insertCsj(); if ($res) { return "<script>alert('導入成功!');window.history.back(-1);</script>"; } } }
我這邊沒有導入cvs結尾的excle表格沒有走 PhpSpreadsheet 因為中文讀取為空。可能是我的表哥有問題吧。
我的表格這個樣子