PHPExcel提供了一个强大的操作表格的php类库,之前都是copy使用,简单的使用,对于复杂的表格的处理还是难以上手。
一,针对PHPExcel是封闭好的类开,一般有一个基本的类需要包含或者导入到当前的业务代码中,这个类就是PHPExcel.php,针对这个类,大家只需要关注构造函数那堆初始化各种操作对象。
public function __construct()
{
$this->uniqueID = uniqid();
$this->calculationEngine = new PHPExcel_Calculation($this);
//sheet操作类
$this->workSheetCollection = array();
$this->workSheetCollection[] = new PHPExcel_Worksheet($this);
$this->activeSheetIndex = 0;
//表格属性操作类
$this->properties = new PHPExcel_DocumentProperties();
// Create document security
$this->security = new PHPExcel_DocumentSecurity();
// Set named ranges
$this->namedRanges = array();
// Create the cellXf supervisor
$this->cellXfSupervisor = new PHPExcel_Style(true);
$this->cellXfSupervisor->bindParent($this);
// Create the default style
$this->addCellXf(new PHPExcel_Style);
$this->addCellStyleXf(new PHPExcel_Style);
}
常用的的基本就是上面2个,一个属性设置类,一堆的set,相对应的一堆的get方法。一个是sheet操作类,这个是主要的内容操作处理类。
二,下面一个简单的例子
<?php
/**
* PHPExcel应用之一 写xlxs文件 并提供下载
**/
require_once dirname(__FILE__) . '/PHPExcel/Classes/PHPExcel.php';
$objExcel = new PHPExcel();
//xlsx相关属性操作方法 关联类 PHPExcel/Classes/PHPExcel/DocumnentProperties.php
$objExcel->getProperties()->setCreator("author") //设置作者
->setLastModifiedBy("last save author") //最后一次保存者
->setTitle("title") //标题
->setSubject("subject") //主题
->setDescription("remark") //备注
->setKeywords("mark") //标记
->setCategory("category"); //类别
//对sheet cell进行操作
$objExcel->setActiveSheetIndex(0) //会返回worksheet对象 关联类 PHPExcel/Classes/PHPExcel/Worksheet.php
->setCellValue('A1', 'A1')
->setCellValue('B1', 'B1')
->setCellValue('C1', 'C1')
->setCellValue('D1', 'D1');
$objExcel->setActiveSheetIndex(0) //会返回worksheet对象 关联类 PHPExcel/Classes/PHPExcel/Worksheet.php
->setCellValue('A2', 'A2')
->setCellValue('B2', 'B2')
->setCellValue('C2', 'C2')
->setCellValue('D2', 'D2');
//设置sheet标题
$objExcel->getActiveSheet()->setTitle('the first sheet');
//设置为第一个sheet为活动状态
$objExcel->setActiveSheetIndex(0);
//保存
$filename = "test.xlsx";
$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel2007');
$objWriter->save($filename);
//如果生成并提供下载
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename);
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: cache, must-revalidate');
header('Pragma: public');
$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel2007');
$objWriter->save('php://output');
针对表格的各种属性,大家可以在生成的xlsx上右键属性,详情里看到


三,业务中一般是从DB或者其它为数据类源,例子如下 只用数据那一块即可
1 //数据类源为业务DB select id,name,age,address from info 2 //模拟数据 3 $data = array( 4 array("id"=>1,"name"=>"张一","age"=>1,"address"=>"广东1"), 5 array("id"=>2,"name"=>"张二","age"=>2,"address"=>"广东2"), 6 array("id"=>3,"name"=>"张三","age"=>3,"address"=>"广东3"), 7 array("id"=>4,"name"=>"张四","age"=>4,"address"=>"广东4"), 8 array("id"=>5,"name"=>"张五","age"=>5,"address"=>"广东5"), 9 ); 10 11 //设置标题行 12 $objExcel->setActiveSheetIndex(0) 13 ->setCellValue('A1','ID') 14 ->setCellValue('B1','姓名') 15 ->setCellValue('C1','年龄') 16 ->setCellValue('D1','住址'); 17 18 //内容循环操作即可 从第二行开始 19 $j = 2; 20 foreach($data as $key=>$value){ 21 $objExcel->setActiveSheetIndex(0) 22 ->setCellValue('A'.$j, $value['id']) 23 ->setCellValue('B'.$j, $value['name']) 24 ->setCellValue('C'.$j, $value['age']) 25 ->setCellValue('D'.$j, $value['address']); 26 27 $j++; 28 }
生生成的效果图如下:

四,假设要对写入的某一列加一些效果,可以用PHPExcel的富文本类PHPExcel_RichText.php 可以对cell时行加粗,倾斜,颜色的处理
1 foreach($data as $key=>$value){ 2 //设置某列为富文本 加粗 倾斜 颜色 3 $objRichText = new PHPExcel_RichText(); 4 $objPayable = $objRichText->createTextRun($value['address']); 5 $objPayable->getFont()->setBold(true); 6 $objPayable->getFont()->setItalic(true); 7 $objPayable->getFont()->setColor( new PHPExcel_Style_Color( PHPExcel_Style_Color::COLOR_DARKGREEN ) ); 8 9 $objExcel->setActiveSheetIndex(0) 10 ->setCellValue('A'.$j, $value['id']) 11 ->setCellValue('B'.$j, $value['name']) 12 ->setCellValue('C'.$j, $value['age']) 13 ->setCellValue('D'.$j, $objRichText); 14 15 $j++; 16 }
效果如下:
