过去工做中使用
PHPExcel
较多,碰到并解决了各类大大小小的问题,总结出这样一篇文章,一方面记录本身踩过的坑,一方面与你们分享,让你们少走弯路,并不断完善之,欢迎你们去github
上面star
和提交pull request
,不断补充和优化,打造最全面的PHPExcel
开发解决方案php
Github 地址:https://github.com/tony-yin/P...
原文地址:https://tony-yin.github.io/20...html
yourpath . /phpexcel/PHPExcel.php
$excel = new PHPExcel();
$objexcel = $excel->getActiveSheet();
$objexcel->mergeCells('A1:M1');
$objexcel->getStyle('A1');
$cellFont = $objexcel->getStyle('A1')->getFont();
$fontStyle->setSize(15);
$fontStyle->setBold(true);
$fontStyle->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
$rowStyle = $objexcel->getStyle(1)->getRowDimension();
$rowStyle->setRowHeight(2);
$columnStyle = $objexcel->getStyle('A')->getColumnDimension();
$columnStyle->setWidth(10);
$alignStyle = $objexcel->getStyle('A')->getAlignment();
$alignStyle>setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$alignStyle->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$$alignStyle->setWrapText(true);
如需更早的版本可将Excel2007
换成Excel5
git
$write = PHPExcel_IOFactory::createWriter("xcel, 'Excel2007');
phpexcel
通常获取cell
或者获取列都是经过ABC
这样的英文字母获取的,它也能够经过0、一、二、3
这样的数字表示sheet中的列,从0
开始,0
对应A
,1
对应B
,基本上大多数方法都是数字行列索引,例如getStyleByColumnAndRow($col,$row)
,默认列参数在前,行参数在后,更多的能够参加phpexcel
源码;github
有的时候一个方法须要行列两个参数,例如只须要某一行参数可写成
(null, $row)
,例如只须要得到某一列参数可写成($col, null)
算法
PHPExcel_Cell::columnIndexFromString('A'); // Return 1 not 0;
PHPExcel_Cell::stringFromColumnIndex(0); // Return 'A';
PHPExcel
读取的cell
数字,类型都是double
型,可用gettyle()
方法检测类型,当初我一直使用is_int()
方法无果,搞得焦头烂额。。。浏览器
PHPExcel
生成的表格若是你不加处理,是不会帮你生成边框线的,生成边框线的方法以下:app
$borderArray = array( 'borders' => array( 'allborders' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN ) ) ); $objexcel->getStyle($col1, $row1,$col2, $row2)->applyFromArray($borderArray);
注:函数
getStyle()
能够看需求改成getStyleByColumnAndRow()
方法经过数字行列索引读取style
- array中
PHPExcel_Style_Border::
后面有三种格式分别是BORDER_THIN
和BORDR_MEDIUM
,表示边框线的粗细;getStyle()
中的索引能够是静态的,也能够是动态的,通常是在导出excel
的数据set
完毕后填写左上角的单元格行列索引和右下角的单元格行列索引;参考资料性能
http://phpexcel.codeplex.com/...
http://phpexcel.codeplex.com/...字体
$objexcel->getStyle($pCoordinate)->applyFromArray(array( 'font' => array( 'bold' => true, ), ));
$objexcel->getStyle($pCoordinate)->applyFromArray(array( 'font' => array( 'color' => array( 'rgb' => 'ff0000', ), ), ) );
动态为当前sheet
设置索引,而后获取当前sheet
,即可循环读取每个sheet
内容
$objexcel->setActiveSheetIndex($index); //$index = 0 1 2 3 $objexcel->getActiveSheet(); //return sheet1 sheet2 sheet 3
当需求是给定一个一个模板
excel
,须要往里面塞数据,咱们不必定要经过代码给它设定样式,若是这个模板变化不大,咱们彻底能够存放一个格式相同的静态文件,而后经过PHPExcel
读取,再往里面塞数据,最后进行保存操做,能够达到同样的效果,而且能够节省大量的资源。
在特殊的表格中,合并单元格广泛存在,而多个单元格合并成的一个单元格,只能
setValue()
一次,而咱们如何判断合并单元格的具体行列呢?
$range = $start_cell->getMergeRange(); // 经过合并单元格的开始单元格好比‘A1’,获取合并范围‘A1:A4’ $cell->isInRange($range); // 遍历以后每个单元格即可经过isInRange()方法判断当前单元格是否在合并范围内
通常excel单元格中数据的格式为数据类型,而
PHPExcel
中的getValue()
方法读取的也是数据类型,当把数据从数据类型改成文本类型后,在PHPExcel
中读出来的是PHPExcel_RichText
类型,getValue()
读取返回PHPExcel_RichText
是一个object
类型(PHPExcel_RichText
数据保存格式);那如何读取这一类的数据呢?仔细查看读取出来的对象,不难发现有getPlainText()
这样的方法能够读取文本类型数据,因此咱们只要判断当当前数据为文本数据时用getPlainText()
读取,通常数据用getValue()
读取
if ($cell->getValue() instanceof PHPExcel_RichText) { $value = $cell->getValue(); } else { $value = $cell->getValue(); }
参考资料
http://www.cnblogs.com/DS-CzY...
http://phpexcel.codeplex.com/...
excel
拥有强大的算法功能,通常算法格式为=A3+A4
这类的,复杂的更多,若是使用PHPExcel
提供的默认读取方法getValue()
读取出来的结果则为字符串=A3+A4
,好在PHPExcel
也足够强大,提供了相应的接口:getCalculatedValue()
,这个方法专门读取算法数据,可是咱们不能将这个方法做为默认读取方法,由于这样可能会将一些原本要读成字符串的读成算法数据,并且PHPExcel
没有将它做为默认读取方法的另外一个重要缘由就是算法方式读取很耗时间和性能,通常数据读取根本没有必要这样浪费资源,因此咱们能够采用如下这种方式
if (strstr($cell->getValue(), '=')) { // 判断若是cell内容以=号开头便默认为算法数据 $value = $cell->getCalculatedValue(); } else { $value = $cell->getValue(); }
除了以上所说的文本数据和算法数据外,我还遇到过日期类型数据,好比
2016-12-28
输入到excel
中,它会默认转换成2016/12/28
,若是采用通常的getValue()
方式读取也会读取到错误的数据,PHPExcel
也提供了相应的接口getFormattedValue()
,并提供了适配的识别方式PHPExcel_Shared_Date::isDateTime($cell)
,因此代码就很好实现了
if (PHPExcel_Shared_Date::isDateTime($cell)) { $value = $cell->getFormattedValue(); } else { $value = $cell->getValue(); }
针对
excel
各类数据类型,咱们能够写一个函数,将原有的getValue()
封装一下,这样之后就不用每次都判别一下数据类型了,目前我只遇到上面三种特殊格式,若是有新的,欢迎你们补充,封装函数以下
function get_value_of_cell($cell) { if (strstr($cell->getValue(), '=')) { $value = $cell->getCalculatedValue(); } else if ($cell->getValue() instanceof PHPExcel_RichText) { $value = $cell->getValue(); } else if (PHPExcel_Shared_Date::isDateTime($cell)) { $value = $cell->getFormattedValue(); } else { $value = $cell->getValue(); } }
$filename = 'xxx导出表'; // 判断若是是IE内核形式的浏览器采用urlencode处理文件名 if (!preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) { $filename = urlencode($filename); }
未完待续。。。期待你的补充和优化