PHPExcel想必大家都不陌生,是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格
本次只做数据导出功能的实现,而且我也只做了数据导出(  ̄ー ̄)!
废话少说
1. 导入类库
首先需要下载类库,官方网站:http://phpexcel.codeplex.com/
将下载下来的包解压:PHPExcel_1.8.0_doc.zip\Classes下面的文件就是我们需要的
ThinkPHP第三方类需要放在/ThinkPHP/Library/Vendor下面,新建一个文件夹PHPExcel,将需要的类放进去
2. 工具类
我在Application目录下新建个模块Lib,用于存放公共的工具类
新建文件 ExcelOperation.class.php
代码如下:有需要的可以自己扩展
17.04.22-更新:解决表头超过26列报错:Invalid cell coordinate
这种错误主要是表头AA,AB,AC...,ord()转换问题
<?php /** * PHPExcel * Created by dbn * Date: 2016/12/15 */ namespace Lib; class ExcelOperation { public function __construct() { vendor('PHPExcel.PHPExcel'); vendor('PHPExcel.PHPExcel.IOFactory'); vendor('PHPExcel.PHPExcel.Writer.Excel5'); vendor('PHPExcel.PHPExcel.Writer.Excel2007'); } /** * 数据导出 * @param string $fileName 文件名 * @param array $headArr 表头数据(一维) * @param array $data 列表数据(二维) * @param int $width 列宽 * @return bool */ public function push($fileName="", $headArr=array(), $data=array(), $width=20) { if (empty($headArr) && !is_array($headArr) && empty($data) && !is_array($data)) { return false; } $date = date("YmdHis",time()); $fileName .= "_{$date}.xls"; $objPHPExcel = new \PHPExcel(); //设置表头 $tem_key = "A"; foreach($headArr as $v){ if (strlen($tem_key) > 1) { $arr_key = str_split($tem_key); $colum = ''; foreach ($arr_key as $ke=>$va) { $colum .= chr(ord($va)); } } else { $key = ord($tem_key); $colum = chr($key); } $objPHPExcel->getActiveSheet()->getColumnDimension($colum)->setWidth($width); // 列宽 $objPHPExcel->getActiveSheet()->getStyle($colum)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // 垂直居中 $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFont()->setBold(true); // 字体加粗 $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v); $tem_key++; } $objActSheet = $objPHPExcel->getActiveSheet(); $border_end = 'A1'; // 边框结束位置初始化 // 写入内容 $column = 2; foreach($data as $key => $rows){ //获取一行数据 $tem_span = "A"; foreach($rows as $keyName=>$value){// 写入一行数据 if (strlen($tem_span) > 1) { $arr_span = str_split($tem_span); $j = ''; foreach ($arr_span as $ke=>$va) { $j .= chr(ord($va)); } } else { $span = ord($tem_span); $j = chr($span); } $objActSheet->setCellValue($j.$column, $value); $border_end = $j.$column; $tem_span++; } $column++; } $objActSheet->getStyle("A1:".$border_end)->getBorders()->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN); // 设置边框 $fileName = iconv("utf-8", "gb2312", $fileName); //重命名表 //$objPHPExcel->getActiveSheet()->setTitle('test'); //设置活动单指数到第一个表 $objPHPExcel->setActiveSheetIndex(0); ob_end_clean();//清除缓冲区,避免乱码 header('Content-Type: application/vnd.ms-excel'); header("Content-Disposition: attachment;filename=\"$fileName\""); header('Cache-Control: max-age=0'); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); //文件通过浏览器下载 exit; } }
PHPExcel在绘制样式时会做大量的时间,当数据量过大时,大家要有个取舍!
注:表头和内容顺序一定要对应上