两种方式将 phpexcel 整合到thinkPHP框架中
一:导入phpexcel
/ThinkPHP/Library/Vendor/PHPExcel
调用方法
Vendor('PHPExcel.PHPExcel');
$phpexcel = new PHPExcel();
二:导入phpexcel
//Common/org/PHPExcel
调用方法
- //导入PHPExcel类库
- import("Common.Org.PHPExcel");
$phpexcel = new \PHPExcel();//因为路径问题,前面加\
语法使用
public function out(){
//读取库里所有的表
$sql="show tables";
$result=M()->query($sql);
foreach ($result as $k=>$v) {
$k++;
$_sql="SHOW FULL COLUMNS FROM ".$v['tables_in_'.C('DB_NAME')];
$data[][0]=array("表 {$k}.".$v['tables_in_'.C('DB_NAME')]."表",'','','','','','');
$data[][1]=array("字段","类型","校对","NULL","键","默认","额外","权限","注释");
$data[]=M()->query($_sql);
$data[][]=array();
}
//导入PHPExcel类库
import("Common.Org.PHPExcel");
import("Common.Org.PHPExcel.Writer.Excel5");
import("Common.Org.PHPExcel.IOFactory.php");
$filename="test_excel";
$this->getExcel($filename,$data);
}
private function getExcel($fileName,$data){
//对数据进行检验
if(empty($data)||!is_array($data)){
die("data must be a array");
}
$date=date("Y_m_d",time());
$fileName.="_{$date}.xls";
//创建PHPExcel对象,注意,不能少了\
$objPHPExcel=new \PHPExcel();
$objProps=$objPHPExcel->getProperties();
$column=2;
$objActSheet=$objPHPExcel->getActiveSheet();
$objPHPExcel->getActiveSheet()->getStyle()->getFont()->setName('微软雅黑');//设置字体
$objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(25);//设置默认高度
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth('5');//设置列宽
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth('22');//设置列宽
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth('22');//设置列宽
$objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth('40');//设置列宽
//设置边框
$sharedStyle1=new \PHPExcel_Style();
$sharedStyle1->applyFromArray(array('borders'=>array('allborders'=>array('style'=>\PHPExcel_Style_Border::BORDER_THIN))));
foreach ($data as $ke=>$row){
foreach($row as $key=>$rows){
if(count($row)==1&&empty($row[0][1])&&empty($rows[1])&&!empty($rows)){
$objPHPExcel->getActiveSheet()->setSharedStyle($sharedStyle1, "A{$column}:J{$column}");//设置边框
array_unshift($rows,$rows['0']);
$objPHPExcel->getActiveSheet()->mergeCells("A{$column}:J{$column}");//合并单元格
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFont()->setSize(12);//字体
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFont()->setBold(true);//粗体
//背景色填充
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->getStartColor()->setARGB('FFB8CCE4');
}else{
if(!empty($rows)){
array_unshift($rows,$key+1);
$objPHPExcel->getActiveSheet()->setSharedStyle($sharedStyle1,"A{$column}:J{$column}");//设置边框
}
}
if($rows['1']=='字段'){
$rows[0]='ID';
//背景色填充
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->getStartColor()->setARGB('FF4F81BD');
}
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
$objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getAlignment()->setWrapText(true);//换行
//行写入
$span = ord("A");
foreach($rows as $keyName=>$value){
// 列写入
$j=chr($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
}
}
$fileName = iconv("utf-8", "gb2312", $fileName);
//设置活动单指数到第一个表,所以Excel打开这是第一个表
$objPHPExcel->setActiveSheetIndex(0);
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=\"$fileName\"");
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); //文件通过浏览器下载
exit;
}
总结一下最近使用phpexcel类导出excel 文件时遇到的问题,主要包括三大类:
1.导出时提示找不到文件怎么办?
2.导出excel时中文出现乱码的问题。
3.导出数据量大时,提示内存超过最大值或者运行时间超时的问题。
先看下phpexcel常用的方法总结(摘录自zeal_blog:http://www.zeali.net/entry/556)
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"); // Add some data $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', 'Hello') ->setCellValue('B2', 'world!') ->setCellValue('C1', 'Hello') ->setCellValue('D2', 'world!'); // Miscellaneous glyphs, UTF-8 $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A4', 'Miscellaneous glyphs') ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); // Rename worksheet $objPHPExcel->getActiveSheet()->setTitle('Simple'); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $objPHPExcel->setActiveSheetIndex(0); // Redirect output to a client’s web browser (Excel5) header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="01simple.xls"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit;
使用时常见的问题总结:
1.关于提示找不到文件的问题:
原因可能有:缓冲区没有打开或者mb_overlod_func函数没有关闭,
解决这个问题的最好办法是把php.ini中display_errors打开,下载文件,打开后会提示相应错误信息。
display_errors=On,
设置后excel中会有错误信息
若为
'break' not in the 'loop' or 'switch' context | |||||||||
错误位置 | |||||||||
FILE: /private/var/www/backend/ThinkPHP/Library/Org/Util/PHPExcel/Calculation/Functions.php LINE: 576 |
在 phpExcel 的 文件中查看版本信息
这是1.8版本运行在php7上存在的一个Bug,将phpexcel升级至1.8.1就可以了。
若是后者,则需要打开php.ini文件,找到mbsrtring.func_overload=7将其隐掉。
若能正常导出excel但是没有数据,则一般是程序错误(没有取到数据或数据没赋值)
2.导出excel时出现乱码的问题,这个问题网上的答案很多。主要的解决方案有:
(1).乱码原因:客户使用的中文版Windows系统平台,而Windows平台的文件名编码为 gb2312(gbk),而我们网页编码为了跟进现存潮流 一般都采用utf-8(国际化)编码,这时当我们:header("Content-Disposition: inline; filename=\"" . $filename . ".xls-:special:1:-")时就会出现乱码,假如你的网页编码就是gb2312那就不用考虑编码问题了(否则转码了反而会出现乱码)。
解决办法:对$filename转码,执行:iconv('utf-8", "gb2312", $filename)。假如你的环境不支持iconv函数可以换别的函数,只要能将$filename的编码转为gbk就行。
(2):输出文件的时候加上相应的头信息:
Header('content-Type:application/vnd.ms-excel;charset=utf-8');
(3).如果以上方法还是出现乱码,则可能是输出缓冲区中有其他多余的内容,在php文件中设置excel内容之间清理一下输出缓冲区吧:<?php ob_clean();?>
以上三步基本可以涵盖到多数excel乱码的问题。
3.导出大数据时提示错误
打开php.ini文件中的display_errors,查看具体错误信息:一般情况下有两类:
(1).runtime 超过了maxium time,这个时候可能的原因是文件中出现了死循环或者大循环。检查源码看是否有死循环。建议不要在循环体中设置excel格式,占据的时间超多。经初步测试,在循环体中设置3-4个格式,则大约1500条数据时就会出现运行超时的问题。因此尽量把设置格式的代码放置到循环体外。如果还有问题,则有两种方法:修改ini文件,把time_limit=0;远程不能修改ini文件则需要在程序中添加set_time_limit(0);
(2).memory size of ....bytes exhausted这是典型的内存不够用的情况。如可以修改php.ini文件则找到memory_limit = 32M将其改为memory_limit = 64M或者更大128M.如是远程不能修改php.ini文件,则需要在代码中修改:@ini_set('memory_limit','128M');