composer下载phpspreadsheet
composer require phpoffice/phpspreadsheet
封装一个类 :app\lib\Excel.php
<?php namespace app\lib; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet; use think\exception\ValidateException; use think\facade\Filesystem; class Excel { // excel导入 public static function importExcel($filename = "") { $file[] = $filename; try { // 验证文件大小,名称等是否正确 validate(['file' => 'filesize:51200|fileExt:xls,xlsx']) ->check($file); // 将文件保存到本地 $savename = Filesystem::putFile('topic', $file[0]); // 截取后缀 $fileExtendName = substr(strrchr($savename, '.'), 1); // 有Xls和Xlsx格式两种 if ($fileExtendName == 'xlsx') { $objReader = IOFactory::createReader('Xlsx'); } else { $objReader = IOFactory::createReader('Xls'); } // 设置文件为只读 $objReader->setReadDataOnly(TRUE); // 读取文件,tp6默认上传的文件,在runtime的相应目录下,可根据实际情况自己更改 $objPHPExcel = $objReader->load(public_path() . 'storage/' . $savename); //excel中的第一张sheet $sheet = $objPHPExcel->getSheet(0); // 取得总行数 $highestRow = $sheet->getHighestRow(); // 取得总列数 $highestColumn = $sheet->getHighestColumn(); Coordinate::columnIndexFromString($highestColumn); $lines = $highestRow - 1; if ($lines <= 0) { echo('数据不能为空!'); exit(); } // 直接取出excle中的数据 $data = $objPHPExcel->getActiveSheet()->toArray(); // 删除第一个元素(表头) array_shift($data); // 返回结果 return $data; } catch (ValidateException $e) { return $e->getMessage(); } } // 导出 public static function export($header = [], $type = true, $data = [], $fileName = "") { // 实例化类 $preadsheet = new Spreadsheet(); // 创建sheet $sheet = $preadsheet->getActiveSheet(); // 循环设置表头数据 foreach ($header as $k => $v) { $sheet->setCellValue($k, $v); } // 生成数据 $sheet->fromArray($data, null, "A2"); // 样式设置 $sheet->getDefaultColumnDimension()->setWidth(12); // 设置下载与后缀 if ($type) { header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); $type = "Xlsx"; $suffix = "xlsx"; } else { header("Content-Type:application/vnd.ms-excel"); $type = "Xls"; $suffix = "xls"; } // 激活浏览器窗口 header("Content-Disposition:attachment;filename=$fileName.$suffix"); //缓存控制 header("Cache-Control:max-age=0"); // 调用方法执行下载 $writer = IOFactory::createWriter($preadsheet, $type); // 数据流 $writer->save("php://output"); } }
控制器层调用:
一:excel的导入
//路由 Route::get('form', 'admin/form'); //表单 Route::post('index', 'admin/index'); //导入excel表//控制器 public function form(){ return view('form'); } public function index(Request $request) { // 接收文件上传信息 $files = $request->file("myfile"); // 调用类库,读取excel中的内容 $data = Excel::importExcel($files); // 二维数组 dd($data); }//表单 <form action="index" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit" value="提交"> </form>
二:excel的导出
//路由 Route::get('excel', 'admin/get'); //导出excel表 //控制器层方法 public function get() { // 设置表格的表头数据 $header = ["A1" => "编号", "B1" => "姓名", "C1" => "年龄"]; //调Goods模型从goods表查询数据并转数组 $data=\app\model\Goods::sel()->toArray(); // 保存文件的类型 $type= true; // 设置下载文件保存的名称 $fileName = '人员信息统计表'.time(); // 调用方法导出excel Excel::export($header,$type,$data,$fileName); }//模型层方法 static function sel(){ //查询所有 return self::select(); }