>>>>>>此内容版权属于imooc的Veo老师<<<<<<
感兴趣的小伙伴移步至http://www.imooc.com/learn/433进行视频查看
------------------------------我是笔记分割线------------------------------------
PHPExcel导出文件步骤解析 (将网页上的文本数据或数据库里的数据导出到Excel表中)
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
- 服务器 放在服务器里面
- 图形列表
导入
- 全部加载
- 部分加载
读取
- 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);