在使用php的时候,经常需要将数据导出到excel中,但是每次都要去查询一次文档重新写一次,特别麻烦,所以这里将php导出到excel进行了封装,只需要一个函数就可以将数据轻松导入到excel中。
在使用之前,需要先下载phpExcel,可以在http://phpexcel.codeplex.com/releases中下载。
本函数支持一个excel文件生成多个sheet,并生成不同的sheet名字。
导出数据最多支持26x26=676列。
/** * 导出Excel,支持多个sheet,每个 sheet 最多26*26列 * * @param array $data 数据 array('key'=>array('header'=>array('', '', ''), 'sheet_name'=>'', 'data'=>array(array('',''), array('', '')))); * @param string $file 文件名 */ function excel($data, $file=''){ $rows=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); $rowsLength = count($rows); import('Common.Org.excel'); $objPHPExcel = new PHPExcel(); //创建PHPExcel实例 $index = 0; $objPHPExcel->setActiveSheetIndex($index); //设置sheet的起始位置 foreach($data as $sheet=>$val){ $header = $val['header']; $n = 1; //列索引,定义一个 k 变量,目的是在循环输出数据是控制行数 $i = 0; //字母索引 if($index>0){ $objPHPExcel->createSheet(); //创建一个新的工作空间(sheet) } $newRow = $rows; if (count($header) > count($rows)) { //列超过26列 foreach ($rows as $k=>$v) { foreach ($rows as $_k=>$_v) { if (count($newRow) < count($header)) { $newRow[] = $v.$_v; } else { break; } } } } if (count($newRow) < count($header)) { die('数据最多不能超过'.pow($rowsLength, 2). '列'); } if ($header) { foreach($header as $k=>$v){ $letter = $newRow[$i++]; $objPHPExcel->setActiveSheetIndex($index)->setCellValue($letter.$n, $v); if(isset($style['Horizontal'])){ $objPHPExcel->getActiveSheet()->getStyle($letter.$k)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); } } $n++; } if($val['data']){ foreach($val['data'] as $k=>$v){ $i = 0; foreach($v as $v1){ $letter = $newRow[$i++]; $objPHPExcel->setActiveSheetIndex($index)->setCellValue($letter.$n, $v1); } $n++; } } if($val['sheet_name']){ $objPHPExcel->setActiveSheetIndex($index)->setTitle($val['sheet_name']); //设置sheet的名称 } $index++; } $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); //通过PHPExcel_IOFactory的写函数将上面数据 if(!$file){ $file = date('YmdHis').rand(1000, 9999).'.xlsx'; } // Redirect output to a client’s web browser (Excel2007) header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'.$file.'"'); 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->save('php://output'); }