过去工作中使用
PHPExcel
较多,碰到并解决了各种大大小小的问题,总结出这样一篇文章,一方面记录自己踩过的坑,一方面与大家分享,让大家少走弯路,并不断完善之,欢迎大家去
github
上面
star
和提交
pull request
,不断补充和优化,打造最全面的
PHPExcel
开发解决方案
Github 地址:https://github.com/tony-yin/PHPExcel_Road
原文地址:https://tony-yin.github.io/2017/09/18/PHP-Excel/
基础:小试牛刀
1. 引用文件
yourpath . /phpexcel/PHPExcel.php
2. 实例化phpexcel类
$excel = new PHPExcel();
3. 获取当前单sheet(多sheet会在下面讲)
$objexcel = $excel->getActiveSheet();
4. 合并单元格
$objexcel->mergeCells('A1:M1');
5. 获取一个cell的样式
$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);
6. 获取指定版本excel写对象
如需更早的版本可将
Excel2007
换成
Excel5
$write = PHPExcel_IOFactory::createWriter("xcel, 'Excel2007');
进阶:一些有用的小知识
1.行列数字索引方法
phpexcel
一般获取
cell
或者获取列都是通过
ABC
这样的英文字母获取的,它也可以通过
0、1、2、3
这样的数字表示sheet中的列,从
0
开始,
0
对应
A
,
1
对应
B
,基本上大多数方法都是数字行列索引,例如
getStyleByColumnAndRow($col,$row)
,默认列参数在前,行参数在后,更多的可以参加
phpexcel
源码;
2. 单行或单列参数格式
有的时候一个方法需要行列两个参数,例如只需要某一行参数可写成
(null,$row)
,例如只需要获得某一列参数可写成
($col,null)
3. 列的数字索引格式和字母索引格式互转
PHPExcel_Cell::columnIndexFromString('A'); // Return 1 not 0;
PHPExcel_Cell::stringFromColumnIndex(0); // Return 'A';
4.PHPExcel读取数字类型
PHPExcel
读取的
cell
数字,类型都是
double
型,可用
gettyle()
方法检测类型,当初我一直使用
is_int()
方法无果,搞得焦头烂额。。。
5. 多cell边框线设置
PHPExcel
生成的表格如果你不加处理,是不会帮你生成边框线的,生成边框线的方法如下:
$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/workitem/22160
http://phpexcel.codeplex.com/workitem/20150
6. 多cell字体加粗处理
$objexcel->getStyle($pCoordinate)->applyFromArray(array(
'font' => array(
'bold' => true,
),
));
7. 多cell字体颜色处理
$objexcel->getStyle($pCoordinate)->applyFromArray(array(
'font' => array(
'color' => array(
'rgb' => 'ff0000',
),
),
)
);
8. 多sheet导入
动态为当前
sheet
设置索引,然后获取当前
sheet
,便可循环读取每一个
sheet
内容
$objexcel->setActiveSheetIndex($index); //$index = 0 1 2 3
$objexcel->getActiveSheet(); //return sheet1 sheet2 sheet 3
9. 固定格式excel读取在写入
当需求是给定一个一个模板
excel
,需要往里面塞数据,我们不一定要通过代码给它设定样式,如果这个模板变化不大,我们完全可以存放一个格式相同的静态文件,然后通过
PHPExcel
读取,再往里面塞数据,最后进行保存操作,可以达到一样的效果,并且可以节省大量的资源。
10. 合并单元格导入问题
在特殊的表格中,合并单元格普遍存在,而多个单元格合并成的一个单元格,只能
setValue()
一次,而我们如何判断合并单元格的具体行列呢?
$range = $start_cell->getMergeRange(); // 通过合并单元格的开始单元格比如‘A1’,获取合并范围‘A1:A4’
$cell->isInRange($range); // 遍历之后每一个单元格便可通过isInRange()方法判断当前单元格是否在合并范围内
高级:特殊场景特殊手段
1. 单元格文本格式数据处理
一般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/p/4955655.html
http://phpexcel.codeplex.com/discussions/34513
2. 单元格数据算法处理
excel
拥有强大的算法功能,一般算法格式为
=A3+A4
这类的,复杂的更多,如果使用
PHPExcel
提供的默认读取方法
getValue()
读取出来的结果则为字符串
=A3+A4
,好在
PHPExcel
也足够强大,提供了相应的接口:
getCalculatedValue()
,这个方法专门读取算法数据,但是我们不能将这个方法作为默认读取方法,因为这样可能会将一些本来要读成字符串的读成算法数据,而且
PHPExcel
没有将它作为默认读取方法的另一个重要原因就是算法方式读取很耗时间和性能,一般数据读取根本没有必要这样浪费资源,所以我们可以采用以下这种方式
if (strstr($cell->getValue(),