有什么区别?PHPExcel是一个用于处理Excel和CVS文件的开源框架,它基于微软的OpenXML标准和PHP语言。它可用于读取和写入不同格式的电子表格。这是PHP目前最常用的Excel处理工具,但是它有一个非常致命的缺点:占用大量内存,对于大量的表格数据几乎累死人。不喜欢,处理速度很慢,但是功能很丰富,API很多,所以在导出复杂格式的Excel表格的时候,经常不得不用,真是又爱又恨。遗憾的是,PHPExcel官方已经不再维护这个项目了。官方团队在github上新建了一个项目PhpSpreadsheet。新项目使用了很多PHP的新特性,比如命名空间,PSR标准,性能也比PHPExcel高很多,但是项目还在开发中(2017-07-12),最低稳定版尚未发布。估计bug会比较多,不建议使用。下图为项目迁移说明:PHP_XLSXWriter相对于PHPExcel,是一款小巧但功能强大的Excel读写插件,功能没有PHPExcel丰富,冻结表头等很多高级操作都没有,但是它的导出速度非常快,非常适合大数据量,报表格式导出要求不是很复杂,下图是官方速度和内存测试:如何使用PHP_XLSXWriter?下载这是PHP_XLSXWriter的github地址,可以点击download进行下载。解压后可以看到核心文件只有一个:xlswriter.class.php,examples目录为代码示例目录。里面有很多例子供大家参考。使用PHP_XLSXWriter可以胜任日常生活中绝大部分的报表需求。让我们通过一个例子来熟悉一下API的使用。假设我们要导出下图中的报表,通过浏览器下载:代码实现//writerclass$writer=newXLSXWriter();//文件名$filename="example.xlsx";//设置header,Forbrowserdownloadheader('Content-disposition:attachment;filename="'.XLSXWriter::sanitize_filename($filename).'"');header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");header('Content-Transfer-Encoding:binary');header('Cache-Control:must-revalidate');header('Pragma:public');//导出数据$string=array(0=>array('payc_bill_time'=>'2017-07-1216:40:44','payt_received_date'=>'2017-07-12','ci_name'=>'rent','payt_num'=>'YRZB(2012)A0047','payt_scsr_name'=>'李巧红','payt_received'=>'300.00','paytd_type'=>'现金','emp_name'=>'郑振标',),1=>array('payc_bill_time'=>'2017-07-1216:39:55','payt_received_date'=>'2017-07-12','ci_name'=>'rent','payt_num'=>'YRZB(2012)A0046','payt_scsr_name'=>'22222','payt_received'=>'45.00','paytd_type'=>'cash','emp_name'=>'郑振标',));//每列表头$title=array(0=>'账单时间',1=>'收货时间',2=>'账单项目',3=>'账单编号',4=>'客户姓名',5=>'Amountreceived',6=>'Receiptmethod',7=>'Payee',);//工作簿名称$sheet1='sheet1';//指定每一列的数据类型,对应单元格的数据类型foreach($titleas$key=>$item){$col_style[]=$key==5?'price':'string';}//设置列格式,suppress_row:多去掉一行数据;widths:指定每列的宽度$writer->writeSheetHeader($sheet1,$col_style,['suppress_row'=>true,'widths'=>[20,20,20,20,20,20,20,20]]);//写入第二行的数据,顺便指定样式$writer->writeSheetRow($sheet1,['xxx财务报表'],['height'=>32,'font-size'=>20,'font-style'=>'bold','halign'=>'center','valign'=>'center']);/*设置标题头并指定样式*/$styles1=array('font'=>'宋体','font-size'=>10,'font-style'=>'bold','fill'=>'#eee','halign'=>'center','border'=>'left,right,top,bottom');$writer->writeSheetRow($sheet1,$title,$styles1);//最后是数据,foreach写入foreach($dataas$value){foreach($valueas$item){$temp[]=$item;}$rows[]=$temp;unset($temp);}$styles2=['height'=>16];foreach($rowsas$row){$writer->writeSheetRow($sheet1,$row,$styles2);}//合并单元格,第一行大标题需要合并单元格$writer->markMergedCell($sheet1,$start_row=0,$start_col=0,$end_row=0,$end_col=7);//输出文档$writer->writeToStdOut();退出(0);上面的每一行代码都有注释。不明白的可以查看example文件夹中的代码示例和官网首页的文档,但是文档比较短;跳坑攻略:在使用过程中也可以使用。踩过一些坑,列在这里,希望对大家有所帮助:文件名与类名不对应。这在使用require或者require_once的时候其实是没有问题的,但是在使用自动加载的时候因为两者不对应,你可能识别不到。我想在你的项目中引入xlsxwriter.class.php文件,并添加一个命名空间,这样就可以自动加载了。此时需要做的是将文件名改为类名XLSXWriter.class.php(这里引入TP)。比如我把它放在Component目录下,那么就加上命名空间namespaceComponent;到文件。此时文件中还有一个Zip类没有引入命名空间,需要添加useZipArchive;这些完成后,就可以在项目的其他地方使用了:useComponent;$writer=newXLSXWriter();如何设置列格式?不同的列可能需要显示不同的格式。默认格式为文本,但有时需要显示为数字列,这样在excel中使用函数更方便。例如上表中的金额栏必须有两位小数,千分位数,数字格式。看上面的代码,数字格式其实是在writeSheetHeader方法中设置的,type为price的列就是amount列。如果需要其他格式,官网首页列出了常用的格式。你能单独设置一个单元格的值吗?这尚未实施。现在数据是逐行写的,不支持这么细的粒度,但是折中的办法是对不需要填充的单元格写null;如果有任何使用问题,可以在下方留言一起讨论如何使用:)
