【慕课笔记】PHPExcel学习笔记(不断更新中...)

>>>>>>此内容版权属于imooc的Veo老师<<<<<<php

感兴趣的小伙伴移步至http://www.imooc.com/learn/433进行视频查看
html


------------------------------我是笔记分割线------------------------------------
mysql

PHPExcel导出文件步骤解析 (将网页上的文本数据或数据库里的数据导出到Excel表中)
sql

Excel类比 PHPExcel导出步骤
新建一个Excel表格 - 实例化PHPExcel类
建立sheet(内置表) - createSheet()方法(建立一个新的sheet)
- setActiveSheetIndex方法 (把某个sheet设置sheet为当前活动的sheet)
- getActiveSheet方法(得到当前活动sheet的操做对象)
填充数据 - setCellValue()方法
保存文件 - PHPExcel_IOFactory::createWriter()方法
- save()方法

PHPExcel导出到本地文档

 demo.php数据库

<?php

	$dir=dirname(__FILE__); //找到当前脚本所在路径
	require $dir."/PHPExcel/PHPExcel.php"; //引入文件
	$objPHPExcel = new PHPExcel(); //实例化PHPExcel类,等同于在桌面上新建一个Excel表格
	$objSheet = $objPHPExcel->getActiveSheet(); //得到当前活动sheet的操做对象
	$objSheet->setTitle('demo'); //给当前活动sheet设置名称
	
	/* 填充单行数据
	* $objSheet->setCellValue("A1","姓名")->setCellValue("B1","分数"); //给当前活动sheet填充数据
	* $objSheet->setCellValue("A2","张三")->setCellValue("B2","50");
	*/

	//不推荐这个,PHPExcel是一个比较耗内存的操做,数据少还能够,数据大就不行了
	$array=array{
		array(), //插入空行,第一行为空,从第二行开始填充
		array("","姓名","分数"), //插入空列,从第二列开始
		array("","李四","60"),
		array("","王五","70")
	}
	
	$objSheet->fromArray($array); //直接加载数据块来填充数据
	$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,"Excel2007"); //按照指定格式生成excel格式 "Excel5"
//即Excel2003 生成.xls, 或者"Excel2007" 生成.xlsx
	$objWriter->save($dir."/demo.xlsx");
	 
?>


PHPExcel导出MySQL数据库数据到本地文档或者浏览器

dbconfig.php数组

<?php
$phpexcel=array(
	'host'=127.0.0.1;
	'username'=>'root';
	'password'=>'',
	'database'=>'phpexcel',
	'charset'=>'utf8'
);
?>

db.php

<?php
	require dirname(__FILE__).'/dbconfig.php'; //引入配置文件
	
	class db{
		public $conn=null;
		public function __construct($config){
			$this->conn=mysql_connect($config['host'],$config['username'], $config['password']) or die(mysql_error());
			mysql_select_db($config['database'],$this->conn) or die(mysql_error()); //选择数据库
			mysql_query('set names'.$config['charset']) or die(mysql_error()); //设定mysql编码
		}
		
		/*
		**根据传入sql语句 查询mysql结果集
		*/

		public function getResult($sql){
			$resource=mysql_query($sql, $this->conn) or die(mysql_error()); //查询sql语句
			$res=array();
			while(($row=mysql_fetch_assoc($resource))!=false){
				$res[]=$row;
			
			}
			return $res;
	
		}

		/*
		根据传入年级数,查询每一个年级的学生数据
		*/

		public function getDataByGrade($grade){
			$sql="select username, score, class from user where grade=".$grade."order by score desc";
			$res=self::getResult($sql);
			return $res;
		}

	}


?>

读取数据并输出本地文件保存

export.php
浏览器

<?php
	$dir=dirname(__FILE__); //查找当前脚本所在路径
	require $dir.'/db.php'; //引入mysql操做类文件
	require $dir.'/PHPExcel/PHPExcel.php'; //引入PHPExcel
	$db= new db($phpexcel); //实例化db类,链接数据库
	$objPHPExcel=new PHPExcel(); //实例化PHPExcel类,等同于在桌面上新建一个excel
	for($i=1;$i<=3;$i++){
		if($i>1){
			$objPHPExcel->createSheet(); //建立新的内置表
		}
		$objPHPExcel->setActiveSheetIndex($i-1); //把新建立的sheet设定为当前活动sheet
		$objSheet=$objPHPExcel->getActiveSheet(); //获取当前活动sheet
		$objSheet->setTitle($i,'年级'); //给当前活动活动sheet取个名称
		
		//开始填充数据
		$data=$db->getDataByGrade($i); //查询每一个年级的学生数据
		$objSheet->setCellValue("A1","姓名")->setCellValue("B1","分数")->setCellValue("C1","班级"); //设置第一行标题的内容
		$j=2; //从第二行开始
		foreach($data as $key=>$val){
			$objSheet->setCellValue("A".$j,$val['username'])->setCellValue("B".$j,$val['score'])->setCellValue("C".$j,$val[class]."班"); //从第二行开始循环打印数据库里的数据
			$j++; //必定要记住加这个,向下递增行数,不然一直在覆盖第二行
		}
	}
	$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5'); //生成excel文件
	$objWriter->save($dir."/export_1.xls");//保存文件

?>

读取数据并输出到浏览器
<?php
	$dir=dirname(__FILE__); //查找当前脚本所在路径
	require $dir.'/db.php'; //引入mysql操做类文件
	require $dir.'/PHPExcel/PHPExcel.php'; //引入PHPExcel
	$db= new db($phpexcel); //实例化db类,链接数据库
	$objPHPExcel=new PHPExcel(); //实例化PHPExcel类,等同于在桌面上新建一个excel
	for($i=1;$i<=3;$i++){
		if($i>1){
			$objPHPExcel->createSheet(); //建立新的内置表
		}
		$objPHPExcel->setActiveSheetIndex($i-1); //把新建立的sheet设定为当前活动sheet
		$objSheet=$objPHPExcel->getActiveSheet(); //获取当前活动sheet
		$objSheet->setTitle($i,'年级'); //给当前活动活动sheet取个名称
		
		//开始填充数据
		$data=$db->getDataByGrade($i); //查询每一个年级的学生数据
		$objSheet->setCellValue("A1","姓名")->setCellValue("B1","分数")->setCellValue("C1","班级"); //设置第一行标题的内容
		$j=2; //从第二行开始
		foreach($data as $key=>$val){
			$objSheet->setCellValue("A".$j,$val['username'])->setCellValue("B".$j,$val['score'])->setCellValue("C".$j,$val[class]."班"); //从第二行开始循环打印数据库里的数据
			$j++; //必定要记住加这个,向下递增行数,不然一直在覆盖第二行
		}
	}
	$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5'); //生成excel文件
	browser_export('Excel5','browser_excel03.xls'); //输出到浏览器
	$objWriter->save('php://output');

	function browser_export($type, $filename){
		if($type=='Excel5'){
			header('Content-Type: application/vnd.ms-excel'); //告诉浏览器将要输出excel 2003文件
		}else{
			header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); //告诉浏览器输出excel 2007文件
		}
		header('Content-Disposition: attachment;filename="'.$filename.'"'); //告诉浏览器将输出文件的名称
		header('Cache-Control: max-age=0'); //禁止浏览器缓存
	}

?>

PHPExcel导入文件步骤解析

步骤一:实例化excel读取对象
步骤二:加载excel文件 - 所有加载(有十几个sheet,只要两个sheet,浪费不少没必要要的sheet,对内存损耗大)
                                           - 选择加载(选择咱们只须要的sheet,其余的都无论了,对内存损耗小)
步骤三:读取excel文件 - 所有读取(把全部的数据都放在一个大数组里面,代码简单,可是内存消耗大)
                                           - 逐行读取(逐行读取,代码复杂,可是内存消耗小)


read.php缓存

<?php
header("Content-Type:text/html;charset=utf-8");
$dir=dirname(__FILE__); //找到当前脚本所在路径
require $dir."/PHPExcel/PHPExcel/IOFactory.php"; //引入读取excel的类文件
$filename=$dir."/export_1.xls";

$fileType=PHPExcel_IOFactory::identify($filename); //自动获取文件的类型提供给PHPExcel用
$objReader=PHPExcel_IOFactory::createReader($fileType); //获取文件读取操做对象

$sheetName=array(’2年级‘,'3年级');
$objReader->setLoadSheetsOnly($sheetName);//只加载指定的sheet
$objPHPExcel=$objReader->load($filename); //加载文件(选择加载) 

//$objPHPExcel=PHPExcel_IOFactory::load($filename);//加载文件(所有加载,已经浪费了不少内存)


$sheetCount=$objPHPExcel->getSheetCount();//获取excel文件里有多少个sheet

/** 
* 所有读取
*
* for($i=0;$i<$sheetCount;$i++){
*	$data=$objPHPExcel->getSheet($i)->toArray(); //读取每一个sheet里的数据所有放入到数组中
* }
**/

/** 
* 逐行读取: PHPExcel提供了一个迭代器,循环取迭代器里面的东西就行
*/
foreach($objPHPExcel->getWorksheetIterator() as $sheet){
	foreach($sheet->getRowIterator() as $row){//逐行处理
		if($row->getRowIndex()<2){ //取消姓名,班级,分数的那一行
			continue; 
		}
		foreach($row->getCellIterator() as $cell){ //逐列读取
			$data=$cell->getValue();//获取单元格数据
			echo $data." ";
		}
		echo "<br/>";
	}
	echo "<br/>";
}


exit;
?>



总结:
PHPExcel
服务器

导出
- 普通列表  fromArray -
                    setCellValue - 按行按列一个一个地填充数据
                    - 样式控制
- 生成文件
                    - 浏览器 Excel5 和Excel07
                    - 服务器 放在服务器里面
- 图形列表app


导入
- 所有加载
- 部分加载

读取
- toArray
- 按列读取


启用缓存
默认 - 按cell占用PHP内存

cache_in_memory_serialized 序列化存放PHP内存(所占空间小了不少)
cache_in_memory_gzip 进一步压缩
cache_in_memory_disclSAM 存放于硬盘(耗时会很长)
cache_in_memory_phpTemp 存放于临时文件夹
cache_in_memcache 存放于memcache里,也是使用内存,速度快(最好)

若是要使用memcache,在开发者文档里复制过来:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache; //选择memcache缓存
$cacheSettings = array( 
'memcacheServer' => 'localhost',
'memcachePort' => 11211,
'cacheTime' => 600
);
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);