当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 19:20:36 PHP

在过去的工作中大量使用PHPExcel,遇到并解决了大大小小的各种问题,总结了这么一篇文章,一方面记录自己踩过的坑,另一方面hand分享给大家,让大家少走弯路,不断完善。欢迎在github上star和提交pullrequest,不断补充优化,打造最全面的PHPExcel开发解决方案Github地址:https://github.com/tony-yin/P...原文地址:https://tony-yin.github.io/20...基础:小测试1.参考文件yourpath./phpexcel/PHPExcel.php2.实例化phpexcel类$excel=newPHPExcel();3.获取当前单张(多张下面会讲到)$objexcel=$excel->getActiveSheet();4.合并单元格$objexcel->mergeCells('A1:M1');5.获取单元格的样式$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->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);自动换行$$alignStyle->setWrapText(true);6.获取指定版本的excel写入对象。如果需要更早的版本,可以将Excel2007换成Excel5$write=PHPExcel_IOFactory::createWriter("xcel,'Excel2007');进阶:一些有用的小知识1.行列号索引方法Phpexcel一般通过获取单元格或列英文字母如ABC,也可以用数字表示,如0、1、2、3sheet中的列从0开始,0对应A,1对应B,基本上大部分方法都是数字行和列索引,如getStyleByColumnAndRow($col,$row),默认列参数在前,行参数在后。更多可以参看phpexcel源码;2.单行或单列参数格式有时一个方法需要一行和一列两个参数,比如只有某一行参数可以写成(null,$row),比如只有某一列参数可以写成($col,null)3.转换列的数字索引格式和字母索引格式。数字到字符串PHPExcel_Cell::columnIndexFromString('A');//返回1而不是0;字符串到数字PHPExcel_Cell::stringFromColumnIndex(0);//返回'A';4.PHPExcel读取数字类型PHPExcel读取的单元格数字都是double类型,可以使用gettyle()方法检测类型。一开始用is_int()方法也没有用,不知所措……5、多单元格边框设置如果你不对PHPExcel生成的表格进行处理,是不会帮你生成边框线的。生成边框线的方法如下:$borderArray=array('borders'=>array('allborders'=>array('style'=>PHPExcel_Style_Border::BORDER_THIN)));$objexcel->getStyle($col1,$row1,$col2,$row2)->applyFromArray($borderArray);注意:getStyle()可以看需求改成getStyleByColumnAndRow()方法,通过数字行列索引读取stylearray中的PHPExcel_Style_Border::后面有三种格式,分别是BORDER_THIN和BORDR_MEDIUM,表示边框线的粗细;getStyle()中的索引可以是静态的或动态的。一般导出excel数据集后,左上角填写单元格行列索引,右下角填写单元格行列索引;参考http://phpexcel.codeplex.com/...http://phpexcel.codeplex。com/...6。多单元格字体加粗处理$objexcel->getStyle($pCoordinate)->applyFromArray(array('font'=>array('bold'=>true,),));7.更多单元格字体颜色处理$objexcel->getStyle($pCoordinate)->applyFromArray(array('font'=>array('color'=>array('rgb'=>'ff0000',),),));8.多sheet导入为当前sheet动态设置index,然后获取当前sheet,然后循环读取每张sheet的内容$objexcel->setActiveSheetIndex($index);//$index=0123$objexcel->getActiveSheet();//returnsheet1sheet2sheet39.固定格式excel读写当需求是给一个模板excel时,我们需要往里面塞数据,我们没必要通过代码设置样式。如果模板变化不大,我们可以存储一个相同格式的静态文件,然后通过PHPExcel读取,然后把数据塞进去,最后保存操作,达到同样的效果,可以省很多资源10、导入合并单元格的问题在特殊表格中,合并单元格很常见,多个单元格合并形成的单元格只能setValue()一次,但是我们如何判断合并单元格的具体行列呢?$range=$start_cell->getMergeRange();//通过合并单元格的起始单元格得到合并范围'A1:A4',如'A1'$cell->isInRange($range);//遍历完每个单元格后可以通过isInRange()方法判断当前单元格是否在合并范围内。)方法还读取数据类型。当数据由数据类型变为文本类型时,在PHPExcel中读取PHPExcel_RichText类型,getValue()读取并返回PHPExcel_RichText作为对象类型(PHPExcel_RichText数据存储格式);那么如何读取这类数据呢?仔细看读取的对象,不难发现有getPlainText()这样的方法可以读取文本类型的数据,所以我们只需要判断当前数据为文本数据时,使用getPlainText()读取即可,并使用getValue()读取一般数据参考http://www.cnblogs。com/DS-CzY...http://phpexcel.codeplex.com/...2。单元格数据算法处理excel具有强大的算法功能,一般的算法格式为=A3+A4,复杂的有很多,如果使用PHPExcel默认提供的读取方法getValue(),读取结果将是一个字符串=A3+A4。好在PHPExcel也足够强大,提供了相应的接口:getCalculatedValue(),这个方法专门用来读取Algorithm数据,但是我们不能把这个方法作为默认的读取方法,因为这样可能会读取一些应该读取的算法数据字符串和PHPExcel不将其作为默认读取方式的另一个重要原因是算法读取非常耗时和性能。一般数据读取不需要浪费资源,所以我们可以使用下面的方法if(strstr($cell->getValue(),'=')){//判断单元格内容是否以=号开头,它将默认为算法数据$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.read方法的封装对于excel中的各种数据类型,我们可以写一个函数把原来的getValue()封装起来,这样就不需要了以后每次都要判断数据类型。目前我只遇到以上三种特殊格式。如果有新的,欢迎大家补充,封装函数如下functionget_value_of_cell($cell){if(strstr($cell->getValue(),'=')){$value=$cell->得到计算值();}elseif($cell->getValue()instanceofPHPExcel_RichText){$value=$cell->getValue();}否则如果(PHPExcel_Shared_Date::isDateTime($cell)){$value=$cell->getFormattedValue();}else{$value=$cell->getValue();}}5。IE、360等浏览器导出文件的文件名中文乱码问题$filename='xxxexporttable';//判断IE内核形式的浏览器是否使用urlencode处理文件名if(!preg_match("/Firefox/",$_SERVER["HTTP_USER_AGENT"])){$filename=urlencode($filename);}待续。.期待您的补充和优化