利用PHP_XLSXWriter代替PHPExcel的方法示例


Posted in PHP onJuly 16, 2017

前言

本文主要给大家介绍的是关于利用PHP_XLSXWriter代替PHPExcel的方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

二者有何区别?

PHPExcel 是一个处理Excel,CVS文件的开源框架,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格,这也是PHP至今最通用的Excel处理工具,但是它有一个非常致命的缺点: 特别占内存,对大批量的表格数据几乎会让人累觉不爱,处理速度非常慢,但是它功能非常丰富,API非常多,所以在导出复杂格式的Excel表格时,你往往不得不使用它,真是让人又爱又恨。

不幸的是,PHPExcel官方已不再维护了这个项目了,官方团队在github上又起了一个新项目,叫PhpSpreadsheet,新项目使用了大量的php新特性,比如命名空间,PSR标准,性能也比PHPExcel高了不少,不过该项目至今(2017-07-12)还是开发状态,最小稳定版还没出来,估计bug会比较多,所以并不建议使用,下图是项目迁移说明:

利用PHP_XLSXWriter代替PHPExcel的方法示例

相比于PHPExcel,PHP_XLSXWriter是一个小而强悍的Excel读写插件,它并没有PHPExcel功能丰富,很多高级操作比如冻结表头,并不具备,但是它导出速度非常快,非常适合于数据量特别大,报表格式不是很复杂的导出需求,下图是官方的速度和内存测试:

利用PHP_XLSXWriter代替PHPExcel的方法示例

PHP_XLSXWriter 如何使用?

下载

这是PHP_XLSXWriter的github地址,当然大家也可以通过本地下载,你可以点击下载把它下载下来。解压之后你可以看到,它的核心文件只有一个: xlswriter.class.php,examples目录为代码样例目录,里面有很多例子你可以参考。

利用PHP_XLSXWriter代替PHPExcel的方法示例

使用

对于日常中绝大部分的报表需求,PHP_XLSXWriter 是可以胜任的,下面通过一个例子来熟悉一下API的使用。

假设我们要导出下图中的报表,并通过浏览器实现下载:

利用PHP_XLSXWriter代替PHPExcel的方法示例

代码实现:

//writer 类
$writer = new XLSXWriter();
 //文件名
$filename = "example.xlsx";
//设置 header,用于浏览器下载
header('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-12 16:40:44',
 'payt_received_date' => '2017-07-12',
 'ci_name' => '租金',
 'payt_num' => 'YRZB(2012)A0047',
 'payt_scsr_name' => '李巧红',
 'payt_received' => '300.00',
 'paytd_type' => '现金',
 'emp_name' => '郑振标',
 ),
 1 => 
 array (
 'payc_bill_time' => '2017-07-12 16:39:55',
 'payt_received_date' => '2017-07-12',
 'ci_name' => '租金',
 'payt_num' => 'YRZB(2012)A0046',
 'payt_scsr_name' => '22222',
 'payt_received' => '45.00',
 'paytd_type' => '现金',
 'emp_name' => '郑振标',
 )
 );
 //每列的标题头
$title = array (
 0 => '开单时间',
 1 => '收款时间',
 2 => '开票项目',
 3 => '票据编号',
 4 => '客户名称',
 5 => '实收金额',
 6 => '收款方式',
 7 => '收款人',
);
//工作簿名称
$sheet1 = 'sheet1';

//对每列指定数据类型,对应单元格的数据类型
foreach ($title as $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 ($data as $value) {
 foreach ($value as $item) { $temp[] = $item;}
 $rows[] = $temp;
 unset($temp);
}
$styles2 = ['height'=>16];
foreach($rows as $row){
 $writer->writeSheetRow($sheet1, $row,$styles2);
}

//合并单元格,第一行的大标题需要合并单元格
$writer->markMergedCell($sheet1, $start_row=0, $start_col=0, $end_row=0, $end_col=7);
//输出文档
$writer->writeToStdOut();
exit(0);

上面的每行代码都做了注释,如果不懂得话可以去查看一下example文件夹中的代码样例以及官网主页的文档,不过文档比较简短;

跳坑指南:

自己在使用过程中也踩过一些坑,这里列一下,希望对你有帮助:

文件名与类名不对应

在使用require或require_once时,这其实不是问题,但当使用自动加载时因为二者不对应就无法识别。你或许想把xlsxwriter.class.php文件引入到你的项目中,并且加上命名空间,以便于能实现自动加载。此时你需要做的是把文件名更改为类名XLSXWriter.class.php(这里引入到TP中),比如我放到Component目录下,那么在该文件中添加命名空间namespace Component;,此时该文件中还有个Zip类未引入命名空间,需要添加use ZipArchive;

这些完成后,就可以在项目中其他地方使用了:

use Component;
$writer = new XLSXWriter();

如何设置列格式?

不同的列可能会需要显示不同的格式,默认的都是文本格式,但有时候需要显示为数字列,比便于使用excel中的函数,比如上表中的金额列,必须是两位小数点,千分位,数字格式。

看上面的代码,数字格式其实是在writeSheetHeader方法中设置的,类型为price的那一列就是金额列,如果你需要其他格式,官网首页上列出了常用的格式。

能不能单独设置某个单元格的值?

这个目前并没有实现,现在数据的写入都是逐行写入的,不支持这么细的粒度,不过折中的做法是把不需要填充的单元格写入null即可;

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
福利彩票幸运号码自动生成器
Oct 09 PHP
利用 window_onload 实现select默认选择
Oct 09 PHP
fleaphp crud操作之find函数的使用方法
Apr 23 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
Jun 25 PHP
19个超实用的PHP代码片段
Mar 14 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
php中通过DirectoryIterator删除整个目录的方法
Mar 13 PHP
Zend Framework分页类用法详解
Mar 22 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP多进程简单实例小结
Nov 09 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 #PHP
Laravel网站打开速度优化的方法汇总
Jul 16 #PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 #PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 #PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 #PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 #PHP
PHP微信PC二维码登陆的实现思路
Jul 13 #PHP
You might like
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php 缩略图实现函数代码
2011/06/23 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
php适配器模式简单应用示例
2019/10/23 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
医学生个人求职信范文
2013/09/24 职场文书
求职毕业生自荐书
2014/02/08 职场文书
购房协议书范本
2014/10/02 职场文书
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL