在使用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');
}