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 }
效果如下: