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