ThinkPHP5 excel 导入/导出
首先vendor下引入phpexcel
use phpexcel\phpexcel\Classes\PHPExcel;//excel引入 /** * excel导入 * @author gyj <375023402@qq.com> * @createtime 2018-10-30 10:12:16 * @param $file 导入文件 * @return data */ if (!function_exists('import_excel')) { function import_excel($file){ //引入excel类 vendor('phpexcel.phpexcel.Classes.PHPExcel'); //判断文件是否存在 if (!file_exists($file)) { die('no file!'); } // 判断文件是什么格式 $extension = strtolower( pathinfo($file, PATHINFO_EXTENSION) ); //根据文件类型执行对应的数据获取方法 if($extension === 'csv'){ //获取文件内容 $data=file_get_contents($file); $data=explode("\r\n", $data); //解析数组 foreach ($data as $key => $value) { if($key > 0){ $tmp_data[] = explode(",", $value); } } //将解析结果组装进数组 $data = $tmp_data; }else{ //设置最大执行时间 ini_set('max_execution_time', '0'); //根据文件后缀获取,文件对象 $inputFileType = PHPExcel_IOFactory::identify($file); $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objExcel = $objReader->load($file); $sheet = $objExcel ->getActiveSheet(); // 取得总行数 $highestRow = $sheet->getHighestDataRow(); // 取得总列数,并将列的字母转成数字序号使用 $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestDataColumn()); //循环读取excel文件,读取一条,插入一条 $data=array(); //从第二行开始读取数据 for($y=2;$y<=$highestRow;$y++){ //为空的行 $empty_col = 0; //从A列读取数据 for($i=0;$i<$highestColumn;$i++){ //将列的数字序号转成字母使用 $x = PHPExcel_Cell::stringFromColumnIndex($i); // 读取单元格 $value = $sheet->getCell($x.$y)->getValue(); //判断单元格数据是否为空 if(empty($value)){ $empty_col++; } //将单元格数据填充入数组 $data[$y-2][]=$value; } //判断是否整行为空,如果是 跳出循环 if($empty_col == $highestColumn){ unset($data[$y-2]); break; } } } return $data; } } /** * excel导出 * @author gyj <375023402@qq.com> * @createtime 2018-10-29 15:01:51 * @param $data 数据源 * @param $filename 文件名 * @param $sheet_title 表头 * @return excel */ if (!function_exists('export_excel')) { function export_excel($data,$filename,$sheet_title){ vendor('phpexcel.phpexcel.Classes.PHPExcel');//引入excel类 $PHPExcel = new \PHPExcel(); //实例化PHPExcel类,类似于在桌面上新建一个Excel表格 $PHPSheet = $PHPExcel->getActiveSheet(); //获得当前活动sheet的操作对象 $PHPSheet->setTitle($filename); //给当前活动sheet设置名称 /*--------------设置表头信息------------------*/ $x = 'A'; foreach ($sheet_title as $value) { $PHPSheet->setCellValue($x.'1', $value)->getStyle($x.'1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $x++; } /*--------------表格数据填充------------------*/ $y =2; foreach ($data as $value) { $x = 'A'; foreach ($value as $val) { $PHPSheet->setCellValue($x.$y,$val)->getStyle($x.$y)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $PHPSheet->getColumnDimension($x)->setAutoSize(true); $x++; } $y++; } $PHPExcelWriter = new \PHPExcel_Writer_Excel2007($PHPExcel); /* 生成到浏览器,提供下载 */ ob_end_clean(); //清空缓存 header("Pragma: public"); header("Expires: 0"); header("Cache-Control:must-revalidate,post-check=0,pre-check=0"); header("Content-Type:application/force-download"); header("Content-Type:application/vnd.ms-execl"); header("Content-Type:application/octet-stream"); header("Content-Type:application/download"); header('Content-Disposition:attachment;filename="'.$filename.'.xlsx"'); header("Content-Transfer-Encoding:binary"); $PHPExcelWriter->save('php://output'); exit; } }
调用
//导入 // 获取上传文件表单字段名 $fileKey = array_keys(request()->file()); // 获取表单上传文件 $file = request()->file($fileKey['0']); // 移动到框架应用根目录/public/uploads/ 目录下 $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads' . DS . 'excel'); $path=str_replace('\\','/',$info->getSaveName()); $url = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'excel' . DS.$path; $data = import_excel($url); var_dump($data); //导出 $data = db('device')->field('id,device_no,name')->select(); $title = ["编号","设备序号","名称"]; $res = export_excel($data,"test",$title); var_dump($res);exit;
注意事项:
加载测试文件
下面主要判断Excel2007和Excel5类型,即xlsx/xlsm/xltx/xltm和xls/xlt格式文件
try { $inputFileType = PHPExcel_IOFactory::identify($filePath); if ($inputFileType !== "Excel5" && $inputFileType !== "Excel2007" ) { unlink($filePath) && str_alert(-1,"请确保导入的文件格式正确!"); } $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objPHPExcel = $objReader->load($filePath); } catch(Exception $e) { unlink($filePath) && str_alert(-1,'加载文件发生错误:”'.pathinfo($filePath,PATHINFO_BASENAME).'”: '.$e->getMessage()); }
获取工作表行数和列数
$highestRow = $sheet->getHighestRow(); $highestColumn = $sheet->getHighestColumn();
注意:有时候你会发现你的表格明明有内容的行数就5行,但是获取到的$highestRow却有7,8行或者更多,这可能是因为你在操作你的表格的时候不小心点击了其它行数,虽然没有填写内容,但getHighestRow也是能够识别出行数;
想要获取有内容的行数应该使用getHighestDataRow和getHighestDataColumn,
源码注释是这样介绍的string Highest row number that contains data,即包含数据的字符串最高行数.
转换时间
获取表格中时间格式的内容,需要PHPExcel_Shared_Date::ExcelToPHP()来转换为php可识别的时间格式
date('Y-m-d',PHPExcel_Shared_Date::ExcelToPHP($sometime);
或者在读取的时候进行处理
读出的时间是天数
excel 的日期是从 1900-01-01 开始计算的(php 是从 1970-01-01)
两者间有一个天数差 25569
时间是格林威治时间
所以有
$d = 25569; $t = 24 * 60 * 60; echo gmdate('Y-m-d H:i:s', (41728.732916667 - $d) * $t);
本文部分内容摘自:https://blog.csdn.net/weixin_36595597/article/details/81132472