专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  北京大学出的第二份 DeepSeek ... ·  昨天  
码农翻身  ·  中国的大模型怎么突然间就领先了? ·  昨天  
程序员的那些事  ·  印度把 DeepSeek ... ·  4 天前  
OSC开源社区  ·  宇树王兴兴早年创业分享引围观 ·  5 天前  
程序员的那些事  ·  成人玩偶 + ... ·  6 天前  
51好读  ›  专栏  ›  SegmentFault思否

打造最全面的 PHPExcel 开发解决方案

SegmentFault思否  · 公众号  · 程序员  · 2017-09-29 08:00

正文

过去工作中使用 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. 引用文件
  1. yourpath . /phpexcel/PHPExcel.php

2. 实例化phpexcel类
  1. $excel = new PHPExcel();

3. 获取当前单sheet(多sheet会在下面讲)
  1. $objexcel = $excel->getActiveSheet();

4. 合并单元格
  1. $objexcel->mergeCells('A1:M1');

5. 获取一个cell的样式
  1. $objexcel->getStyle('A1');

  • 获取一个cell的字体样式

  1. $cellFont = $objexcel->getStyle('A1')->getFont();

  • 设置字体大小

  1. $fontStyle->setSize(15);

  • 设置字体是否加粗

  1. $fontStyle->setBold(true);

  • 设置字体颜色

  1. $fontStyle->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);

  • 获取一行样式

  1. $rowStyle = $objexcel->getStyle(1 )->getRowDimension();

  • 设置行高度

  1. $rowStyle->setRowHeight(2);

  • 获取一列样式

  1. $columnStyle = $objexcel->getStyle('A')->getColumnDimension();

  • 设置列宽度

  1. $columnStyle->setWidth(10);

  • 获取一列对齐样式

  1. $alignStyle = $objexcel->getStyle('A')->getAlignment();

  • 设置水平居中:同一水平线上居中,即为左右的中间

  1. $alignStyle>setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

  • 设置垂直居中:同一垂直线居中,即为上下的中间

  1. $alignStyle->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

  • 自动换行

  1. $$alignStyle->setWrapText(true);

6. 获取指定版本excel写对象

如需更早的版本可将 Excel2007 换成 Excel5

  1. $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. 列的数字索引格式和字母索引格式互转

  • 数字转字符串

  1. PHPExcel_Cell::columnIndexFromString('A');  // Return 1 not 0;

  • 字符串转数字

  1. PHPExcel_Cell::stringFromColumnIndex(0);    // Return 'A';

4.PHPExcel读取数字类型

PHPExcel 读取的 cell 数字,类型都是 double 型,可用 gettyle() 方法检测类型,当初我一直使用 is_int() 方法无果,搞得焦头烂额。。。

5. 多cell边框线设置

PHPExcel 生成的表格如果你不加处理,是不会帮你生成边框线的,生成边框线的方法如下:

  1. $borderArray = array(

  2.    'borders' => array(

  3.        'allborders' => array(

  4.            'style' => PHPExcel_Style_Border::BORDER_THIN

  5.        )

  6.    )

  7. );

  8. $objexcel->getStyle($col1, $row1,$col2, $row2)->applyFromArray($borderArray);

注:

  1. getStyle() 可以看需求改为 getStyleByColumnAndRow() 方法通过数字行列索引读取 style

  2. array中 PHPExcel_Style_Border:: 后面有三种格式分别是 BORDER_THIN BORDR_MEDIUM ,表示边框线的粗细;

  3. getStyle() 中的索引可以是静态的,也可以是动态的,一般是在导出 excel 的数据 set 完毕后填写左上角的单元格行列索引和右下角的单元格行列索引;

参考资料

http://phpexcel.codeplex.com/workitem/22160 http://phpexcel.codeplex.com/workitem/20150

6. 多cell字体加粗处理
  1. $objexcel->getStyle($pCoordinate)->applyFromArray(array(

  2.    'font' => array(  

  3.        'bold' => true,                                              

  4.    ),                                                              

  5. ));

7. 多cell字体颜色处理
  1. $objexcel->getStyle($pCoordinate)->applyFromArray(array(

  2.    'font' => array(

  3.        'color' => array(

  4.            'rgb' => 'ff0000',

  5.            ),

  6.        ),

  7.    )

  8. );

8. 多sheet导入

动态为当前 sheet 设置索引,然后获取当前 sheet ,便可循环读取每一个 sheet 内容

  1. $objexcel->setActiveSheetIndex($index);   //$index = 0 1 2 3

  2. $objexcel->getActiveSheet();    //return sheet1 sheet2 sheet 3

9. 固定格式excel读取在写入

当需求是给定一个一个模板 excel ,需要往里面塞数据,我们不一定要通过代码给它设定样式,如果这个模板变化不大,我们完全可以存放一个格式相同的静态文件,然后通过 PHPExcel 读取,再往里面塞数据,最后进行保存操作,可以达到一样的效果,并且可以节省大量的资源。

10. 合并单元格导入问题

在特殊的表格中,合并单元格普遍存在,而多个单元格合并成的一个单元格,只能 setValue() 一次,而我们如何判断合并单元格的具体行列呢?

  1. $range = $start_cell->getMergeRange();  // 通过合并单元格的开始单元格比如‘A1’,获取合并范围‘A1:A4’

  2. $cell->isInRange($range);    // 遍历之后每一个单元格便可通过isInRange()方法判断当前单元格是否在合并范围内

高级:特殊场景特殊手段

1. 单元格文本格式数据处理

一般excel单元格中数据的格式为数据类型,而 PHPExcel 中的 getValue() 方法读取的也是数据类型,当把数据从数据类型改为文本类型后,在 PHPExcel 中读出来的是 PHPExcel_RichText 类型, getValue() 读取返回 PHPExcel_RichText 是一个 object 类型( PHPExcel_RichText 数据保存格式);那如何读取这一类的数据呢?仔细查看读取出来的对象,不难发现有 getPlainText() 这样的方法可以读取文本类型数据,所以我们只要判断当当前数据为文本数据时用 getPlainText() 读取,一般数据用 getValue() 读取

  1. if ($cell->getValue() instanceof PHPExcel_RichText) {

  2.    $value = $cell->getValue();

  3. } else {

  4.    $value = $cell->getValue();

  5. }

参考资料

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 没有将它作为默认读取方法的另一个重要原因就是算法方式读取很耗时间和性能,一般数据读取根本没有必要这样浪费资源,所以我们可以采用以下这种方式

  1. if (strstr($cell->getValue(),







请到「今天看啥」查看全文