风骚无比的PHPExcel封装

PHPExcel对Excel的支持非常之好,网上流行称其风骚无比,功能强大,但用起来并不是十分方便,其实常用的Excel操作只是建sheet、写标题行、写内容、设置宽度和对齐等,还有读内容,对内容进行筛选或处理。故对其进行了简单封装,在这里分享一下,造福人类。呵呵

<?php

/**
 * 将PHPExcel进行常用方法的简单封装
 * @date 2012-11-26
 * @author Ewing 
 * @note 需放到与 PHPExcel.php 同一目录
 */
/** Include PHPExcel */
require_once dirname(__FILE__).'/PHPExcel.php';
require_once dirname(__FILE__).'/PHPExcel/Writer/Excel5.php'; 

function my_array_type($arr){
	$c = count($arr);
	$in = array_intersect_key($arr,range(0,$c-1));
	if(count($in) == $c) {
		return 'index'; //索引数组
	}else if(empty($in)) {
		return 'assoc'; //关联数组
	}else{
		return 'mix'; //混合数组
	}
}

class MyPHPExcel extends PHPExcel{
	private $RowTitleSet = array(); //是否已经设置过标题行
	private $file = null;
	private $xls_bak_dir = 'backup';//导出文件备份
	private $read_sheet_index = null;
	function __construct() {
		
		parent::__construct();//构造父类
		
		$this->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");
	}
	
	/**
	 * 设置读取xls的标签页
	 * @param int $i
	 */
	function set_read_index($i)
	{
		$this->read_sheet_index = $i;
	}
	
	/**
	 * 读取xls内容
	 * @param $start_row 开始行数, $max_row 最大行数
	 */
	function read_xls($start_row=1,$max_row=10000)
	{
		if(!$this->file){
			die("not setFile()");
		}
		$objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format 
		$objPHPExcel = $objReader->load($this->file); 
		
		if( !is_null($this->read_sheet_index) ){
			$objWorksheet = $objPHPExcel->getSheet( $this->read_sheet_index );
		}else{
			$objWorksheet = $objPHPExcel->getActiveSheet();
		}
		$highestRow = $objWorksheet->getHighestRow();           //取得总行数 
		$highestColumn = $objWorksheet->getHighestColumn();
		$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);//总列数
		if($highestRow>$max_row) $highestRow=$max_row; //有时候会读到6万多行		
		
		$arr_Return = array();
		for ($row = $start_row;$row <= $highestRow;$row++) 
		{
		    $arr_info=array();
		    //注意highestColumnIndex的列数索引从0开始
		    for ($col = 0;$col < $highestColumnIndex;$col++)
		    {
		         $cell=$objWorksheet->getCellByColumnAndRow($col, $row)->getValue(); //getValue()  getCalculatedValue()
		         if($cell instanceof PHPExcel_RichText)     //富文本转换字符串
					$cell = $cell->__toString();
				 if(substr($cell,0,1)=='='){ //公式
		         	 $cell=$objWorksheet->getCellByColumnAndRow($col, $row)->getCalculatedValue();
		         }
		         
				 $arr_info[$col] = $cell;
		    }
		   	$arr_Return[] = $arr_info;
		}
		return $arr_Return;
	}
	
	
	/**
	 * 设置标题
	 * @param 例 $arrWidth = array('A'=>'ID' ,'B'=>'中文', 'D'=>'英文') | array('ID' ,'中文', '英文')
	 */
	function setRowTitle($arrTitle)
	{
		$index = $this->getActiveSheetIndex();
		$this->RowTitleSet[$index] = true;
		if(my_array_type($arrTitle)=='assoc'){
			foreach ($arrTitle as $Column=>$value){
				$this->getActiveSheet()->setCellValue($Column.'1', $value);
			}
		}else{
			$start = 'A';
			for($i=0; $i<count($arrTitle); $i++){
				$Column = $start++;
				$this->getActiveSheet()->setCellValue($Column.'1', $arrTitle[$i]);
			}
		}
	}
	
	/**
	 * 设置EXCEL每行内容
	 *
	 * @param array $xls_rows
	 * e.g. $xls_rows = array(
	 * 		   array('content1','content2','content3'),
	 * 		   array('A'=>'content1','B'=>'content2','C'=>'content3'),
	 * 		   ...
	 * 		)
	 */
	function setRows($xls_rows)
	{
		$index = $this->getActiveSheetIndex();
		$n = $this->RowTitleSet[$index] ? 2 : 1;
		foreach ($xls_rows as $row) {
			if(my_array_type($row)=='assoc') { //关联
				foreach ($row as $Column=>$value){
					$this->getActiveSheet()->setCellValue($Column.$n, $value);
					$this->getActiveSheet()->getStyle($Column.$n)->getAlignment()->setWrapText(true)->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); 
				}
			}else{ 
				$start = 'A';
				for($i=0; $i<count($row); $i++){
					$Column = $start++;
					$this->getActiveSheet()->setCellValue($Column.$n, $row[$i]);
					$this->getActiveSheet()->getStyle($Column.$n)->getAlignment()->setWrapText(true)->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); 
				}
			}
			$n++;
			
			#横向|竖向 对齐方式 setHorizontal | setVertical (PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);  //也可生成EXCEL后手动设置也方便 
			# HORIZONTAL_RIGHT | HORIZONTAL_LEFT | HORIZONTAL_CENTER  参考PHPExcel/Style/Alignment.php
			# VERTICAL_RIGHT | VERTICAL_LEFT | VERTICAL_CENTER  参考PHPExcel/Style/Alignment.php
			
		}
	}
	
	/**
	 * 设置标题宽度
	 * @param 例 $arrWidth = array('A'=>8 ,'B'=>60, 'C'=>60,'D'=>'auto','E'=>0) | array(8,60,60,0,0)
	 */
	function setRowWidth($arrWidth = array())
	{
		if(my_array_type($arrWidth)=='assoc') { //关联
			foreach ($arrWidth as $Column=>$value){
				if($value=='auto' || $value==0){
					$this->getActiveSheet()->getColumnDimension($Column)->setAutoSize(true);
				}else{
					$this->getActiveSheet()->getColumnDimension($Column)->setWidth($value."pt");
				}
			}
		}else{
			$start = 'A';
			for($i=0; $i<count($arrWidth); $i++){
				$Column = $start++;
				$value = $arrWidth[$i];
				if($value=='auto' || $value==0){
					$this->getActiveSheet()->getColumnDimension($Column)->setAutoSize(true);
				}else{
					$this->getActiveSheet()->getColumnDimension($Column)->setWidth($value."pt");
				}
			}
		}
	}
	
	//设置要保存的文件,测试文件是否可以被打开
	function setFile($file_excel)
	{
		$file_excel = iconv('utf-8','gbk',$file_excel); #能读系统下的中文名文件
		if(!$fp=fopen($file_excel,'a+')){
			throw new Exception("$file_excel can not fopen!!");
		}
		if($fp){
			fclose($fp);
		}
		$this->file = $file_excel;
	}
	
	//保存文件
	function saveFile($file_excel='') 
	{
		$file_excel = $this->file ? $this->file : $file_excel;
		$objWriter = PHPExcel_IOFactory::createWriter($this, 'Excel5');
		$objWriter->save($file_excel); //保存xls
		
		$path_parts = pathinfo($file_excel);
		$dir_bak = $path_parts["dirname"].'/'.$this->xls_bak_dir; //备份
		if(is_dir($dir_bak)){
			$basenameWE = substr($path_parts["basename"],0,strlen($path_parts["basename"]) - (strlen($path_parts["extension"]) + 1) );
			$file_excel_bak = dirname(__FILE__).'/xls/backup/'.$basenameWE.' '.str_replace(':','_',date('Y-m-d H:i:s')).'.xls';
			copy($file_excel,$file_excel_bak);
			echo date('H:i:s') . " copy($file_excel,$file_excel_bak); ",'<br>'.PHP_EOL;
		}
      
	}
}

//使用例子
if($_SERVER['SCRIPT_FILENAME'] == str_replace('\\','/',__FILE__)){ 
	header("Content-type:text/html;charset=utf-8");
	$xml_rows = array(
		array('1','苹果','Apple'),
		array('2','男孩','Boy'),
	);
	#写xls
	$file_excel = dirname(__FILE__).'/test测试.xls';
	$c = new MyPHPExcel();
	$c->setFile($file_excel);
	$c->setActiveSheetIndex(0)->setTitle('测试1'); //PHPExcel的方法
	$c->setRowTitle(array('A'=>'ID','B'=>'中文','C'=>'英文'));
	$c->setRowWidth(array('A'=>'8','B'=>60,'C'=>80,'D'=>'auto'));
	$c->setRows($xml_rows);
	
	$c->createSheet();  
	$c->setActiveSheetIndex(1)->setTitle('测试2');
	$c->setRowTitle(array('ID2','中文2','英文2'));
	$c->setRowWidth(array(8,60,80,0));
	
	$c->setRows($xml_rows);
	$c->saveFile();
	#读xls
	$c = new MyPHPExcel();
	$c->setFile($file_excel);
	$c->set_read_index(0); //读第一个sheet
	$arr = $c->read_xls();
	print_R($arr);echo '<br>';
	$c->set_read_index(1); //读第二个sheet
	$arr = $c->read_xls();
	print_R($arr);
	
}



觉得有用就就顶一下吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值