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 因为中文读取为空。可能是我的表哥有问题吧。
我的表格这个样子