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

过去工做中使用PHPExcel较多,碰到并解决了各类大大小小的问题,总结出这样一篇文章,一方面记录本身踩过的坑,一方面与你们分享,让你们少走弯路,并不断完善之,欢迎你们去github上面star和提交pull request,不断补充和优化,打造最全面的PHPExcel开发解决方案php

Github 地址:https://github.com/tony-yin/P...
原文地址:https://tony-yin.github.io/20...html

基础:小试牛刀

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');
  • 获取一个cell的字体样式
$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换成Excel5git

$write = PHPExcel_IOFactory::createWriter("xcel, 'Excel2007');

进阶:一些有用的小知识

1.行列数字索引方法

phpexcel通常获取cell或者获取列都是经过ABC这样的英文字母获取的,它也能够经过0、一、二、3这样的数字表示sheet中的列,从0开始,0对应A1对应B,基本上大多数方法都是数字行列索引,例如getStyleByColumnAndRow($col,$row),默认列参数在前,行参数在后,更多的能够参加phpexcel源码;github

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生成的表格若是你不加处理,是不会帮你生成边框线的,生成边框线的方法以下:app

$borderArray = array(
    'borders' => array(
        'allborders' => array(
            'style' => PHPExcel_Style_Border::BORDER_THIN
        )
    )
);
$objexcel->getStyle($col1, $row1,$col2, $row2)->applyFromArray($borderArray);

注:函数

  1. getStyle()能够看需求改成getStyleByColumnAndRow()方法经过数字行列索引读取style
  2. array中PHPExcel_Style_Border::后面有三种格式分别是BORDER_THINBORDR_MEDIUM,表示边框线的粗细;
  3. getStyle()中的索引能够是静态的,也能够是动态的,通常是在导出excel的数据set完毕后填写左上角的单元格行列索引和右下角的单元格行列索引;

参考资料性能

http://phpexcel.codeplex.com/...
http://phpexcel.codeplex.com/...字体

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...
http://phpexcel.codeplex.com/...

2. 单元格数据算法处理

excel拥有强大的算法功能,通常算法格式为=A3+A4这类的,复杂的更多,若是使用PHPExcel提供的默认读取方法getValue()读取出来的结果则为字符串=A3+A4,好在PHPExcel也足够强大,提供了相应的接口:getCalculatedValue(),这个方法专门读取算法数据,可是咱们不能将这个方法做为默认读取方法,由于这样可能会将一些原本要读成字符串的读成算法数据,并且PHPExcel没有将它做为默认读取方法的另外一个重要缘由就是算法方式读取很耗时间和性能,通常数据读取根本没有必要这样浪费资源,因此咱们能够采用如下这种方式

if (strstr($cell->getValue(), '=')) {   
    // 判断若是cell内容以=号开头便默认为算法数据
    $value = $cell->getCalculatedValue(); 
} else {
    $value = $cell->getValue();
}

3. 日期数据处理

除了以上所说的文本数据和算法数据外,我还遇到过日期类型数据,好比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();
}

4. 读取方法封装

针对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();
    }
}

5. 导出文件在IE、360等浏览器中文件名中文乱码问题

$filename = 'xxx导出表';
// 判断若是是IE内核形式的浏览器采用urlencode处理文件名
if (!preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) {
    $filename = urlencode($filename);
}

未完待续。。。期待你的补充和优化

相关文章
相关标签/搜索