phpexcel導入導出excel文件經常使用操做

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();
相關文章
相關標籤/搜索