PHP_XLSXWriter代替PHPExcel的方法

利用PHP_XLSXWriter代替PHPExcel的方法

PHPExcel 和 PHP_XLSXWriter 二者之间的区别

    PHPExcel 是一个处理Excel,CVS文件的开源框架,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格,这也是PHP至今最通用的Excel处理工具,但是它有一个非常致命的缺点: 特别占内存,对大批量的表格数据几乎会让人累觉不爱,处理速度非常慢,但是它功能非常丰富,API非常多,所以在导出复杂格式的Excel表格时,你往往不得不使用它,真是让人又爱又恨。
    不幸的是,PHPExcel官方已不再维护了这个项目了,官方团队在github上又起了一个新项目,叫PhpSpreadsheet,新项目使用了大量的php新特性,比如命名空间,PSR标准,性能也比PHPExcel高了不少,不过该项目至今(2017-07-12)还是开发状态,最小稳定版还没出来,估计bug会比较多
    相比于PHPExcel,PHP_XLSXWriter是一个小而强悍的Excel读写插件,它并没有PHPExcel功能丰富,很多高级操作比如冻结表头,并不具备,但是它导出速度非常快,非常适合于数据量特别大,报表格式不是很复杂的导出需求

PHP_XLSXWriter 如何使用

下载

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

代码实现
<?php  
include_once("xlsxwriter.class.php");
ini_set('display_errors', 0);
ini_set('log_errors', 1);
$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, ['测试导出'],
['height'=>32,'font-size'=>16,'font-style'=>'bold','halign'=>'center','valign'=>'center']);

/*设置标题头,指定样式*/
$styles1 = array( 'font'=>'宋体','font-size'=>14,'font-style'=>'bold', 'fill'=>'#eee',
'halign'=>'center', 'border'=>'left,right,top,bottom');

$writer->writeSheetRow($sheet1, $title,$styles1);
// 最后是数据,foreach写入
foreach ($string 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);


posted @ 2018-09-29 14:44  星光下  阅读(5034)  评论(0编辑  收藏  举报