调用:
//制作excel进行导出;
$excelkey= ['1'=>'序号','2'=>'学员姓名','3'=>'学员身份证号码','4'=>'学员性别(男,女,保密)','5'=>'省','6'=>'市','7'=>'区',
'8'=>'联系电话','9'=>'单位','10'=>'专业技术职务系列','11'=>'职称','12'=>'课程名称','13'=>'报名时间','14'=>'错误信息'];
$excelval=['1'=>'num','2'=>'stu_name','3'=>'stu_cardid','4'=>'stu_sex','5'=>'stu_province','6'=>'stu_city','7'=>'stu_area',
'8'=>'stu_mobile','9'=>'stu_emp_name','10'=>'stu_dutid_name','11'=>'stu_pos_name','12'=>'cou_name','13'=>'sig_date','14'=>'msg'];
$return = $this->outPutExcel($error,$excelkey,$excelval,'报名错误数据',false,'20','');
function alphabetical() { return ['1' => 'A', '2' => 'B', '3' => 'C', '4' => 'D', '5' => 'E', '6' => 'F', '7' => 'G', '8' => 'H', '9' => 'I', '10' => 'J', '11' => 'K', '12' => 'L', '13' => 'M', '14' => 'N', '15' => 'O', '16' => 'P', '17' => 'Q', '18' => 'R', '19' => 'S', '20' => 'T', '21' => 'U', '22' => 'V', '23' => 'W', '24' => 'X', '25' => 'Y', '26' => 'Z']; } protected function outPutExcel($data=[],$excelkey=[],$excelval=[],$filedownname='',$yasuo=false, $columnWidth=10, $title='') { ini_set('memory_limit', '1024M'); if($title == '') $title = $filedownname; $abcdef=alphabetical();//获取字母排序 // 新建一个excel对象 大神已经加入了PHPExcel 不用引了 直接用! $objPHPExcel = new \PHPExcel(); //在vendor目录下 \不能少 否则报错 // 设置文档的相关信息 $objPHPExcel->getProperties()->setCreator("博瑞科技");/*设置作者*/ $objPHPExcel->getDefaultStyle()->getFont()->setName('微软雅黑');//字体 //设置第一行的背景颜色 $objPHPExcel->getActiveSheet()->getStyle('A1:M1')->getFill()->applyFromArray(array( 'type' => \PHPExcel_Style_Fill::FILL_SOLID, //PHPEXcel //PHPExcel_Style_Fill 'startcolor' => array( 'rgb' => '2e96ff' ), 'borders' => array( 'allborders' => array( 'style' => \PHPExcel_Style_Border::BORDER_THIN ) ) )); $objPHPExcel->getActiveSheet()->getStyle('N1:N1')->getFill()->applyFromArray(array( 'type' => \PHPExcel_Style_Fill::FILL_SOLID, //PHPEXcel //PHPExcel_Style_Fill 'startcolor' => array( 'rgb' => 'CC5A29' ), 'borders' => array( 'allborders' => array( 'style' => \PHPExcel_Style_Border::BORDER_THIN ) ) )); /*设置表头*/ // $objPHPExcel->getActiveSheet()->mergeCells('A1:S1');//合并第一行的单元格 $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', "$title");//标题 $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(25); // 第一行的默认高度 $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);//设置是否加粗 $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//设置文字居左(HORIZONTAL_LEFT,默认值)中(HORIZONTAL_CENTER)右(HORIZONTAL_RIGHT) $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中 $myrow = 1;/*表头所需要行数的变量,方便以后修改*/ /*表头数据填充*/ $objPHPExcel->getActiveSheet()->getRowDimension('3')->setRowHeight(30);/*设置行高*/ $i=1; foreach ($excelkey as $key=>$val){ $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($abcdef[$i] . $myrow, $val);//设置一张sheet为活动表 添加表头信息 $i++; } // 关键数据 $myrow = $myrow + 1; //刚刚设置的行变量 $mynum = 1;//序号 //遍历接收的数据,并写入到对应的单元格内 foreach ($data as $key => $value) { $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A' . $myrow, $mynum); $i=2; foreach ($excelval as $k1=>$v1){ $objPHPExcel->setActiveSheetIndex(0)->setCellValue($abcdef[$k1] . $myrow, $value[$excelval[$k1]]); $i++; } $objPHPExcel->getActiveSheet()->getRowDimension('' . $myrow)->setRowHeight(20);/*设置行高 不能批量的设置 这种感觉 if(has(蛋)!=0){疼();}*/ $myrow++; $mynum++; } $mynumdata = $myrow - 1; //获取主要数据结束的行号 $objPHPExcel->setActiveSheetIndex(0)->getstyle('A1:P' . $mynumdata)->getAlignment()->setHorizontal(\PHPExcel_style_Alignment::HORIZONTAL_CENTER);/*设置格式 水平居中*/ /*设置数据的边框 手册上写的方法只显示竖线 非常坑爹 所以采用网上搜来的方法*/ // $style_array = array( // 'borders' => array( // 'allborders' => array( // 'style' => \PHPExcel_Style_Border::BORDER_THIN // ) // ), // ); //设置宽width 由于自适应宽度对中文的支持是个BUG因此坑爹的手动设置了每一列的宽度 这种感觉 if(has(蛋)!=0){碎();} $j=1; foreach ($excelkey as $k1=>$v1){ //处理特殊行 I行 if($abcdef[$j]!='N'){ if(in_array($abcdef[$j],['A','B'])) { $objPHPExcel->getActiveSheet()->getColumnDimension($abcdef[$j])->setWidth(($columnWidth/1.5)); }else{ $objPHPExcel->getActiveSheet()->getColumnDimension($abcdef[$j])->setWidth($columnWidth); } }else{ $objPHPExcel->getActiveSheet()->getColumnDimension($abcdef[$j])->setWidth(($columnWidth*2.5)); } $j++; } $objPHPExcel->getActiveSheet()->getStyle('A2:P' . $myrow)->getAlignment()->setWrapText(true);//设置单元格允许自动换行 /*设置表相关的信息*/ $objPHPExcel->getActiveSheet()->setTitle('Title'); //活动表的名称 $objPHPExcel->setActiveSheetIndex(0);//设置第一张表为活动表 //纸张方向和大小 为A4横向 $objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(\PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); $objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(\PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4); //浏览器交互 导出 $file=ROOT_PATH. DS .'public'.DS .'uploads'. DS .'downexcel'. DS .date('Y-m-d'); $downfile=DS .'uploads'.DS .'downexcel'. DS .date('Y-m-d'); if(!is_dir($file)){ mkdir($file,0777,true); } $filedate=date('YmdHis',time()); $filename=$file. DS .$filedownname.$filedate.".xlsx"; $downfilename=$downfile. DS .$filedownname.$filedate.".xlsx"; // $filename = iconv("UTF-8", "GBK", $filename); // 重命名表 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); // If you're serving to IE 9, then the following may be needed header('Cache-Control: max-age=1'); // If you're serving to IE over SSL, then the following may be needed header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header('Pragma: public'); // HTTP/1.0 $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); if(!file_exists($filename)){ fopen($filename,"w"); } $save=$objWriter->save($filename); if($yasuo){ $zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释 $zipName = $file. DS .'download.zip'; $signfile=ROOT_PATH.'public'. DS .'uploads'.DS .'downexcel'.DS .'template'.DS .'BaoMing201904290000001.xlsx'; $files = array($filename,$signfile); if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) { exit('无法打开文件,或者文件创建失败'); } foreach($files as $val){ if(is_file(iconv("UTF-8", "GB2312//IGNORE", $val))){ //addFile函数首个参数如果带有路径,则压缩的文件里包含的是带有路径的文件压缩 $zip->addFile(iconv("UTF-8", "GB2312//IGNORE", $val),basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下 }else{ exit("1找不到".$val); } } $zip->close();//关闭 if(!file_exists($zipName)){ exit("无法找到文件"); //即使创建,仍有可能失败 } $data=['filename'=>"download.zip"]; return ['code'=>'1','filename'=>$data['filename']]; } if($save==null){ $data=['filename'=>$downfilename]; return ['code'=>'1','filename'=>$data['filename']]; }else{ return ['code'=>'0','msg'=>'导出异常']; } exit; } /** * 使用phpspreadsheet导出大数据的csv格式 * 注意传值的顺序要保持一致$excelkey,标题title的文字,要和数据中的字段顺序保持一致; * $excelval只是字段的键值,去重, */ public function outPutCsv($data = [], $comments = [], $outname = '导出') { set_time_limit(0); if (!$data || !$comments) $this->error('暂无导出信息'); $arrData = array_merge($comments, $data); $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); // 设置单元格格式 可以省略 $styleArray = [ 'font' => [ 'bold' => true, 'size' => 14, ], ]; $spreadsheet->getActiveSheet()->getStyle('A1:B1')->applyFromArray($styleArray); $spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(25); $spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(25); $spreadsheet->getActiveSheet()->fromArray($arrData); $writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $filedir = DS . 'uploads' . DS . 'downexcel' . DS . date('Y-m-d');//文件目录 $file = ROOT_PATH . 'public' . $filedir;//文件绝对目录 if (!is_dir($file)) { mkdir($file, 0777, true); } $filedate = $outname . date('YmdHis', time());//文件名字 $filename = $file . DS . $filedate . ".csv";//文件绝对路径的名字 $fp = fopen($filename, 'a+');//打开output流 $dataNum = count($arrData); $perSize = 1000;//每次导出的条数 $pages = ceil($dataNum / $perSize); for ($i = 1; $i <= $pages; $i++) { $arrDataOut = array_slice($arrData, $perSize * ($i - 1), $perSize); foreach ($arrDataOut as $item) { // mb_convert_variables('GBK', 'UTF-8', $item); fputcsv($fp, $item); } //刷新输出缓冲到浏览器 ob_flush(); flush();//必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 } fclose($fp); $data = $filedir . DS . $filedate . ".csv"; return $this->success('导出成功', $data); }
发表评论 取消回复