一、 PHPExcel介绍及使用准备
老师说:作为一名PHP程序员,掌握PHPExcel是一项必备技能,因为要开发和维护各种内容管理后台,经常需要将数据做成报表。
准备工作:
① 下载PHPExcel插件
② 提取classes文件夹放到项目目录下,并重命名为PHPExcel。
③ PHP version 5.2.0 or higher
④ wamp环境,本机使用phpstudy集成环境
二、使用PHPExcel导出文件步骤解析
① 新建一个Excel表格 --> 实例化PHPExcel类
② 创建sheet(内置表)--> createSheet()方法,setActiveSheetIndex方法,getActiveSheet方法
③ 填充数据 --> setCellValue()方法
④ 保存文件 -->PHPExcel_IOFactory::createWriter()方法,save()方法。
⑤ 代码实现
getActiveSheet();
//给当前活动sheet设置名称
$ObjSheet->setTitle('demo');
//给当前活动sheet填充数据
$ObjSheet->setCellValue('A1','姓名')->setCellValue('B1','分数');
$ObjSheet->setCellValue('A2','张三')->setCellValue('B2','80');
//按照指定格式生成文件
$objWriter = PHPExcel_IOFactory::createWriter($ObjPHPExcel,'Excel2007');
//保存文件
$objWriter->save($dir.'/demo.xlsx');
?>
三、PHPExcel导出MySQL数据库数据
0){
//创建新的内置表
$objPHPExcel->createSheet();
}
//把新创建的sheet设定为当前活动sheet
$objPHPExcel->setActiveSheetIndex($i);
//获取当前活动sheet
$objSheet = $objPHPExcel->getActiveSheet();
//设置表名
$objSheet->setTitle($grade[$i]);
//设置表头
$objSheet->setCellValue('A1','序号')->setCellValue('B1','姓名')->setCellValue('C1','班级')->setCellValue('D1','分数');
//查询各年级的学生信息
$data = $db->getDataByGrade($grade[$i]);
$j = 2;
foreach ($data as $value) {
$objSheet->setCellValue('A'.$j, $j-1)->setCellValue('B'.$j, $value['name'])->setCellValue('C'.$j, $value['class'].'班')->setCellValue('D'.$j, $value['score']);
$j++;
}
}
//确保用户打开excel看到的是第一个sheet
$objPHPExcel->setActiveSheetIndex(0);
//生成excel文件
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
//保存文件
$objWriter->save($dir.'/export_1.xls');
?>
四、输出至浏览器
//浏览器输出
browser_export('excel5', 'browser_excel03.xls');
$objWriter->save('php://output');
function browser_export($type, $filename){
if($type == 'Excel5'){
//告诉浏览器要输出excel03文件
header('Content-Type: application/vnd.ms-excel');
}else{
//告诉浏览器输出excel07文件
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
}
//告诉浏览器输出文件的名称
header('Content-Disposition: attachment;filename="'.$filename.'"');
//禁止缓存
header('Cache-Control: max-age=0');
}
五、Excel样式控制
以学生信息表为数据源,分为以下几个步骤来实现信息的填充并完善样式。
根据班级和年级查询学生信息
填充学生信息
填充班级和年级
分别合并班级和年级的单元格 $objPHPExcel->getActiveSheet()->mergeCells(‘A1:D1’);
文字居中 setVertical setHorizontal
设置字体
设置背景色
设置边框 applyFromArray();
单元格内换行 先,getAlignment()->setWrapText(true); 然后setCellValue(‘..\n..’) 然后
超长数字的显示,如果不设置,超长数字就要被转为科学计数,要参考手册里的4.6.7 Explicitly set a cell’s datatype。 $objPHPExcel->getActiveSheet()->setCellValueExplicit(‘A1’,$val, PHPExcel_Cell_DataType::TYPE_STRING);
核心代码:
$objPHPExcel = new PHPExcel();
$db = new db();
$objSheet = $objPHPExcel->getActiveSheet();
//开始本小节的代码编写
$index = 0;
//查询所有年级
$gradeInfo = $db->getAllGrade();
foreach ($gradeInfo as $g_v) {
$gradeIndex = getCells($index*2);
$objSheet->setCellValue($gradeIndex.'2', '高'.$g_v['grade']);
//设置单元格水平和垂直居中
$objSheet->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
//设置默认字体
$objSheet->getDefaultStyle()->getFont()->setName('微软雅黑')->setSize(14);
//设置年级所在行的字体及大小
$objSheet->getStyle('A2:Z2')->getFont()->setSize(20)->setBold(True);
//设置班级所在行的字体及大小
$objSheet->getStyle('A3:Z3')->getFont()->setSize(16)->setBold(True);
$classInfo = $db->getClassByGrade($g_v['grade']);
foreach ($classInfo as $c_v) {
$nameIndex = getCells($index*2);
$scoreIndex = getCells($index*2+1);
$classIndex = $nameIndex;
$objSheet->setCellValue($classIndex.'3', $c_v['class'].'班');
//合并单元格
$objSheet->mergeCells($classIndex.'3:'.$scoreIndex.'3');
//设置班级所在行的边框
$classBorderStyle = getBorderStyle('E351CA');
$objSheet->getStyle($classIndex.'3:'.$scoreIndex.'3')->applyFromArray($classBorderStyle);
//填充班级所在行的背景色
$objSheet->getStyle($classIndex.'3:'.$scoreIndex.'3')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('52E351');
$objSheet->setCellValue($nameIndex.'4', '姓名')->setCellValue($scoreIndex.'4', '分数');
//指定分数这一列默认为文本格式
$objSheet->getStyle($scoreIndex)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
$info = $db->getDataByClassGrade($c_v['class'], $g_v['grade']);
$j = 5;
foreach ($info as $val) {
$objSheet->setCellValue($nameIndex.$j, $val['name'])->setCellValueExplicit($scoreIndex.$j, $val['score'].'3123123123123123213',PHPExcel_Cell_DataType::TYPE_STRING);
$j++;
}
$index++;
}
$endGradeIndex = getCells($index*2-1);
//合并单元格
$objSheet->mergeCells($gradeIndex.'2:'.$endGradeIndex.'2');
//填充年级所在行的背景色
$objSheet->getStyle($gradeIndex.'2:'.$endGradeIndex.'2')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('E36951');
//设置边框样式
$gradeStyle = getBorderStyle('#E3DF51');
$objSheet->getStyle($gradeIndex.'2:'.$endGradeIndex.'2')->applyFromArray($gradeStyle);
}