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

php通用excel导出方法

时间:2023-03-29 16:50:12 PHP

1.通用导出方法在crm或者oa系统中导出excel很常见。做过这个功能的都知道,主要的操作其实就是循环数据列表,然后一个网格一个一个的往固定的单元格中添加数据。只要做一次,后面只需要复制相关代码修改,其他地方的导出功能就完成了。但是这样会存在两个问题:1、修改列表数据字段时,需要修改大量代码,维护难度大,修改难度大;2.多次出现导出功能时,需要在多处复制大量冗余的代码,看着不舒服;所以需要统一导出excel的方法。使用时只需要传入数据的表头、表头字段名称、数据列表、数据表名称即可导出excel。2.使用下图所示的通用导出方式,只要传入4个参数即可完成导出,使用维护变得简单很多。好了,目标已经明确了,接下来就是实现代码了。显然,要实现这个功能,最大的问题就是要根据单条数据的索引和表头字段的顺序,自动计算出excel中每条数据中各个字段的坐标值(比如A1,B3).那么我们来分析一下excel的单元格坐标。从A1开始,数字的值垂直递增,字母水平递增。当水平字母变成Z,下一个字母是AA,然后是AB,...,ZZ,...,AAA...这样的话,我们知道纵坐标很简单,可以根据每条数据的索引值。难的是横坐标,怎么算呢?仔细分析横坐标,可以发现是一个类似于26基制的字母数字。如果把A看成0,那么Z就是25。但是这种数和我们常见的十六进制、八进制等是不一样的,因为带Z的时候,后面的数不是BA,而是AA。在普通的基数中,比如十进制的9,就变成了10,而不是00;在十六进制0xF中,它变为0x10而不是0x00。所以可以参考base转换的算法,然后改成excel计算横坐标(十进制转伪26)的方法://AAA转换publicstaticfunctiontoAAA($dec){if($dec<0)返回'';$y=$dec%26;$x=地板($dec/26);returnself::toAAA($x-1).chr($y+65);}2018-01-19更新:看php手册,找到一个新的简单解决方案,字符递增:最后附上Yii2的完整代码框架,excelexport组件为moonlandsoft/yii2-phpexcel;其他类似//exportxlspublicstaticfunctionexportXls($array){set_time_limit(0);include(Url::to('@vendor/moonland/phpexcel/PHPExcel.php'));包括(Url::to('@vendor/moonland/phpexcel/PHPExcel/Writer/Excel2007.php'));$titles=$array['标题'];$fields=$array['fields'];$list=$array['list'];$name=$array['name'];$count=count($标题);$keys=[];//A=>chr(65)foreach($titlesas$k=>$v){$keys[]=self::toAAA($k);}$objPHPExcel=new\PHPExcel();$objWriter=new\PHPExcel_Writer_Excel2007($objPHPExcel);$objPHPExcel->setActiveSheetIndex(0);$activeSheet=$objPHPExcel->getActiveSheet();$activeSheet->setTitle($name);$activeSheet->getStyle("A1:{$keys[$count-1]}1")->getAlignment()->setHorizo??ntal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);$activeSheet->mergeCells("A1:{$keys[$count-1]}1");$activeSheet->setCellValue('A1',$name);//设置标题,样式foreach($titlesas$key=>$title){$activeSheet->setCellValue($keys[$key].'2',$title);$activeSheet->getColumnDimension($keys[$key])->setWidth(20);$activeSheet->getRowDimension(($key+1))->setRowHeight(18);}$我=3;foreach($listas&$item){foreach($keysas$k=>$v){$val=isset($item[$fields[$k]])?$item[$fields[$k]]。'':'';$activeSheet->setCellValue($v.$i,$val);$i++;}$文件名=$名称。“_”。日期('Y_m_d_His')。'.xlsx';header("缓存控制:public");标题(“Pragma:public");header("Content-type:application/vnd.ms-excel");header("Content-Disposition:attachment;filename=".iconv("utf-8","GB2312//TRANSLIT",$fileName));header('Content-Type:APPLICATION/OCTET-STREAM');ob_clean();ob_start();$objWriter->save('php://output');ob_end_flush();}//AAA转换公共静态函数toAAA($dec){if($dec<0)return'';$y=$dec%26;$x=floor($dec/26);returnself::toAAA($x-1).chr($y+65);}3.导出结果示例导出结果:

最新推荐
猜你喜欢