namespace service; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class ExcelService { /** * @param string $name excel表的表名 * @param array $data 要導出excel表的數據,接受一個二維數組 * @param array $head excel表的表頭,接受一個一維數組 * @throws \PhpOffice\PhpSpreadsheet\Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ public static function outdata($name = '', $data = [], $head = [],$format = "xlsx") { set_time_limit(0); $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // $sheet->setTitle('表名'); $letter = 'A'; foreach($head as $values){ $sheet->setCellValue($letter.'1', $values); ++$letter; } if(is_array($data)){ foreach($data as $k=>$v){ $letter = 'A'; $k = $k+2; reset($head); foreach($head as $key=>$value){ $testKey = explode('.',$key); if(count($testKey)>1){ $val = $v[$testKey[0]][$testKey[1]]; }else{ $val = $v[$key]; } $sheet->setCellValue($letter.$k, $val); ++$letter; } } } ob_end_clean(); if ($format == 'xls') { //輸出Excel03版本 header('Content-Type:application/vnd.ms-excel'); $class = "\PhpOffice\PhpSpreadsheet\Writer\Xls"; } elseif ($format == 'xlsx') { //輸出07Excel版本 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); $class = "\PhpOffice\PhpSpreadsheet\Writer\Xlsx"; } //輸出名稱 header('Content-Disposition:attachment;filename="'.mb_convert_encoding($name,"GB2312", "utf-8").'.'.$format.'"'); //禁止緩存 header('Cache-Control: max-age=0'); $writer = new $class($spreadsheet); // $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output'); // $filePath = env('runtime_path')."temp/".time().microtime(true).".tmp"; // $writer->save($filePath); // readfile($filePath); // unlink($filePath); // header('Content-Type: application/vnd.ms-excel'); // header('Content-Disposition: attachment;filename="' . $name . '.xlsx"'); // header('Cache-Control: max-age=0'); // $writer = new Xlsx($spreadsheet); // $writer->save('php://output'); // // //刪除清空: $spreadsheet->disconnectWorksheets(); unset($spreadsheet); exit; } }
說說遇到的問題:
一開始本地導出完全沒問題,然后放到線上服務器,可以導出,但導出的文件死活打不開(xlsx),提示:EXCEL無法打開文件,因為文件格式或文件擴展名無效;導出xls文件打開是亂碼
解決辦法,在header()導出前添加
ob_end_clean();
清除緩沖區,避免亂碼,重試然后正常導出和打開