web程序開發的時候,常常有關於操做Excel的需求.PHPExcel類是我用過的比較實用的工具[固然,除了那驚人的內存佔用].PHPExcel自己的tar包裏面已經有很是詳細的demo,在這裏我記錄我使用到的一些工做,做爲經常使用的工具類收藏下來,之後若是有用到更多的功能,會不斷的更新.php
首先定義PHPExcel類的路徑[這裏根據你們實際不一樣的目錄結構定義]
web
define('PATH','/var/www/class/PHPExcel/PHPExcel.php');
/** ++++++++++++++++++++++++++++數組
* excel文件導出瀏覽器
++++++++++++++++++++++++++++ */app
首先加載PHPExcel類並實例化,設置相關屬性.工具
include_once PATH; $objPHPExcel = new PHPExcel(); $objPHPExcel->getProperties()->setCreator("Maarten Balliauw") ->setLastModifiedBy("Maarten Balliauw") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") ->setKeywords("office 2007 openxml php") ->setCategory("Test result file");
excel導出對應值運算this
//PHPExcel導出單元格設置 $outputFileName='biby.xls';//輸出excel文件名稱 //處理要輸出的數據爲二維數組,對應形式以下 $data=array( 0=>array(//第一行 0=>'name',//第一列 1=>'sex',//第二列 2=>'age',//第三列 ); 0=>array(//第二行 0=>'name',//第一列 1=>'sex',//第二列 2=>'age',//第三列 ); ); $objPHPExcel->setActiveSheetIndex(0)->setCellValue(A1,$value);//setActiveSheetIndex(0)設置當前sheet && setCellValue(單元格,對應值) //這裏excel是以A1,A2...B1,B2....Z1,Z2的方式處理輸出值對應單元格的,咱們能夠生成對應的數組來存儲這些表示單元格的值,這樣就能夠用循環遍歷的方式處理輸出了 $skeyArr = array(); $k=0; for($i=0;$i<=100;$i++){ //列 for ($j=1; $j <= 100; $j++) { //行 $skeyArr[$k][] = PHPExcel_Cell::stringFromColumnIndex($i) . $j;//PHPExcel_Cell::stringFromColumnIndex將數字轉換爲對應字母列 } $k++; } //最後用嵌套的循環設置每一個對應單元格的值 $l=0;//行 foreach ($data as $key => $value) { $count = count($value); for ($p=0; $p < $count; $p++) { //列 $objPHPExcel->setActiveSheetIndex(0)->setCellValue($skeyArr[$p][$l],$value[$p]); } $l++; }
設置頭文件,告訴瀏覽器如下載方式處理輸出spa
$objPHPExcel->getActiveSheet()->setTitle($outputFileName);//當前sheet名稱 $objPHPExcel->setActiveSheetIndex(0);//當前活動sheet header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$outputFileName.'"');//設置輸出excel文件名稱 header('Cache-Control: max-age=0'); 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 = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');//excel2003版本 //$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');//excel2007版本 $objWriter->save('php://output'); exit;
/** ++++++++++++++++++++++++++++excel
* excel文件導入code
++++++++++++++++++++++++++++ */
excel文件導入一般是讀取excel文件存放成PHP數組,而後就能夠進行相應的操做了[計算,入庫等]
首先一樣是加載PHPExcel類並實例化
include_once PATH; $file_path = '/var/www/biby.test.xls';//要導入的excel文件 $PHPExcel = new PHPExcel(); $PHPReader = new PHPExcel_Reader_Excel2007(); if(!$PHPReader->canRead($file_path)){ $PHPReader = new PHPExcel_Reader_Excel5(); if(!$PHPReader->canRead($file_path)){ $this->error('Excel文件處理錯誤!'); } }
接着加載excel文件並讀取相關信息
$PHPExcel = $PHPReader->load($file_path); $currentSheet = $PHPExcel->getSheet(0);//當前活動sheet $allColumn = $currentSheet->getHighestColumn();//excel最高列值 PHPExcel_Cell::columnIndexFromString($allColumn);//excel文件總列數 $allRow = $currentSheet->getHighestRow();//excel總行數,這裏要注意空白行的影響 $inMonth = $currentSheet->getCellByColumnAndRow(0,2);//這裏用數字表明行列 eg,0,2表明第二行第一列 //能夠用for循環讀取單元格的值,構造咱們須要的數組 $inMonth = PHPExcel_Style_NumberFormat::toFormattedString($inMonth->getCalculatedValue(), 'YYYY-MM');//將讀取的時間值轉換爲咱們須要的格式 //eg: //通常第一行是表頭,咱們能夠用數組來存儲該值 $KeyArr = array('month','name','sex','age');//同時做二維數組下標值 //後面的行數能夠用for嵌套循環讀取 $i = 0; for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {//行循環 && $allRow 行數 $k = 0; for ($j=65; $j > 32; $j--) {//列循環 65爲A對應ASCII碼 32是根據excel表列數,根據第一列是A[65]計算而得 $selcolumn = ord('A') - $j;//列數 if( isset($KeyArr[$k]) ){ if($selcolumn==0){//第一列[月份] && 月份要轉換 $downData[$i][$KeyArr[$k]] = $currentSheet->getCellByColumnAndRow($selcolumn,$currentRow); $downData[$i][$KeyArr[$k]] = PHPExcel_Style_NumberFormat::toFormattedString($DeferData[$i][$DeferKeyArr[$k]]->getCalculatedValue(), 'YYYY-MM'); }else{ $downData[$i][$KeyArr[$k]] = trim($currentSheet->getCellByColumnAndRow($selcolumn,$currentRow)->getValue()); } $k++; }else{ $k++; continue; } } $i++; } //$downData 就是咱們組裝後的數組,能夠根據咱們的業務需求進行對應操做
固然,也能夠將excel讀成一個簡單的二維數組[若是咱們不須要特定結構的數組]
$PHPExcel = $PHPReader->load($file_path); $currentSheet = $PHPExcel->getSheet(0); $currentSheet->ToArray();