phpExcelパッケージ

4170 ワード

<?php

/**

 *     Excel

 * @author zouhao  [email protected]

 *     

 * $excel =new Excel();

	$data=array(

			array('id'=>1,'name'=>'  1'),

			array('id'=>2,'name'=>'  2')

		);

	$header=array('ID','   ');

	$excel->setFileName('aaa');

	$excel->setTitle('   1');

	$excel->create($data,$header);

 */

class Excel {

	private $excelObj;

	private $fileName='download.xls';

	/**

	 *         

	 * @param string $fileName

	 */

	public function setFileName($fileName){

		$this->fileName=$fileName.'.xls';

	}

	/**

	 *     

	 * @param string $title        	

	 */

	public function setTitle($title) {

		$this->excelObj->getActiveSheet ()->setTitle ( $title );

	}

	public function __construct() {

		//              ,   excel        

		spl_autoload_unregister ( 'autoload' );

		require LIBRARY_PATH . '/PHPExcel/PHPExcel.php';

		$this->excelObj = new PHPExcel ();

	}

	/**

	 *     ,     

	 * 

	 * @param int $count        	

	 * @return array

	 */

	private function getCharByNumber($data) {

		//       

		$count = count ( $data ['0'] );

		$keys=array();

		for($number = 1; $number <=$count; $number ++) {

			$divisor= intval($number / 26);

			$char = chr ( 64 + $number % 26 );

			$char = $divisor == 0 ? $char : chr ( 64 +$divisor) . $char;

			$keys [] = $char;

		}

		return $keys;

	}

	/**

	 *   Excel  

	 * @param array $data		    

	 * @param array $replace	       

	 */

	public function create($data,$header=array(),$replace = null) {

		empty($data) and exit('    ');

		$keys = $this->getCharByNumber ( $data );

		$this->createHeader ( $header, $keys );

		$j=0;

		foreach ( $data as $i=>$vo ) {

			$j=0;

			foreach ( $vo as $key => $item ) {

				if (isset ( $replace [$key] )){

					$this->excelObj->setActiveSheetIndex ( 0 )->setCellValue ( $keys [$j] . ($i + 2), $replace [$key] [$item] );

				}else{

					$this->excelObj->setActiveSheetIndex ( 0 )->setCellValue ( $keys [$j] . ($i + 2), $item );

				}

				++$j;

			}

		}

		//              

		header ( "Content-Type: application/force-download" );

		header ( "Content-Type: application/octet-stream" );

		header ( "Content-Type: application/download" );

		header ( 'Content-Disposition:inline;filename="'.$this->fileName.'"' );

		header ( "Content-Transfer-Encoding: binary" );

		header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );

		header ( "Pragma: no-cache" );

		$objWriter = PHPExcel_IOFactory::createWriter ( $this->excelObj, 'Excel5' );

		$objWriter->save ( 'php://output' );

	}

	/**

	 *     

	 * 

	 * @param array $data        	

	 */

	private function createHeader($header, $keys) {

		$header = array_combine ( $keys, $header );

		foreach ( $header as $key => $vo ) {

			$this->excelObj->setActiveSheetIndex ( 0 )->setCellValue ( "{$key}1", $vo );

		}

	}

}
使用例:
 
$excel =new Excel();

	$data=array(

			array('id'=>1,'name'=>'  1'),

			array('id'=>2,'name'=>'  2')

		);

	$header=array('ID','   ');

	$excel->setFileName('aaa');

	$excel->setTitle('   1');

	$excel->create($data,$header);
つまり、データベースから取り出した2次元配列を直接作成することができ、
 
また、あるフィールドはtype、intタイプとして保存する、ある状態を表す.createの3番目のパラメータを参照できます
例:
 
$excel =new Excel();

	$data=array(

			array('id'=>1,'name'=>'  1','type'=>1),

			array('id'=>2,'name'=>'  2','type'=>2)

		);

        $replace['type']=array(1=>'  ',2=>'  ');

	$header=array('ID','   ');

	$excel->setFileName('aaa');

	$excel->setTitle('   1');

	$excel->create($data,$header,$replace);