今天开始接到一个需求,需要用到PHP导出数据到excel表格里。对于导出数据,只需要一张表,直接一条sql语句执行复制粘贴,后来需求变更后,需要三张表,还是一对多的关系,只能需求PHPExcel了,导出后自己做了个公用方法和拓展,留着以后用,如下:
首先从官网http://phpexcel.codeplex.com/
下载phpexcel插件
/** * 公用Excel导入功能,拼成一个大数组 * @DateTime:2017-02-08 11:17:41 * @Author: cc */ function allrow_excel($filePath) { /*导入phpExcel核心类 */ require_once './phpexcel/PHPExcel.php'; require_once './phpexcel/PHPExcel/Writer/Excel5.php'; // 用于其他低版本xls require_once './phpexcel/PHPExcel/Writer/Excel2007.php'; // 用于 excel-2007 格式 $PHPExcel = new \PHPExcel(); /**默认用excel2007读取excel,若格式不对,则用之前的版本进行读取*/ $PHPReader = new \PHPExcel_Reader_Excel2007(); if (!$PHPReader->canRead($filePath)) { $PHPReader = new \PHPExcel_Reader_Excel5(); if (!$PHPReader->canRead($filePath)) { echo 'no Excel'; return; } } $PHPExcel = $PHPReader->load($filePath); $currentSheet = $PHPExcel->getSheet(0); //读取excel文件中的第一个工作表 $allColumn = $currentSheet->getHighestColumn(); //取得最大的列号 $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 $erp_orders_id = array(); //声明数组 /**从第二行开始输出,因为excel表中第一行为列名*/ for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) { /**从第A列开始输出*/ for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)->getValue(); /**ord()将字符转为十进制数*/ if ($val != '') { $erp_orders_id[] = $val; } /**如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出*/ //echo iconv('utf-8','gb2312', $val)."\t"; } } return $erp_orders_id; }
这个方法返回的是一个大数组,所以的单元格数据都在其中
/** * 公用Excel导入功能,一行一个数组 * @DateTime:2017-02-08 11:30:19 * @Author: cc */ function row_excel($filename) { header("Content-type:text/html;charset=utf-8"); require_once './phpexcel/PHPExcel.php'; $PHPExcel = \PHPExcel_IOFactory::load($filename); $currentSheet = $PHPExcel->getSheet(0); //第一个sheet $col = $currentSheet->getHighestColumn(); //取得总列数 $row = $currentSheet->getHighestRow(); //取得总行数 $arr = array(); for ($currentRow = 1; $currentRow <= $row; $currentRow++) { for ($currentColumn = 'A'; $currentColumn <= $col; $currentColumn++) { $arr[$currentRow][] .= $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)->getValue(); } } return $arr; }
这个方法返回的是一行一个子数组,一般我们使用的就是这个方法
/** * 自定义phpexcel通用导出 * data数据,tableheader表头数组,name名称 * @DateTime:2017-02-08 10:16:24 * @Author: cc */ function MyPHPExcel($data, $tableheader, $name) { $start_time = strtotime(I('post.begindate4')); $end_time = strtotime(I('post.enddate4')); //创建对象 import("Org.Util.PHPExcel"); $excel = new \PHPExcel(); //Excel表格式,这里简略写了26列 $letter = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'); //填充表头信息 for ($i = 0; $i < count($tableheader); $i++) { $excel->getActiveSheet()->setCellValue("$letter[$i]1", "$tableheader[$i]"); } //填充表格信息 for ($i = 2; $i <= count($data) + 1; $i++) { $j = 0; foreach ($data[$i - 2] as $key => $value) { $excel->getActiveSheet()->setCellValue("$letter[$j]$i", "$value"); $j++; } } //创建Excel输入对象 import("Org.Util.PHPExcel.Reader.Excel5"); $write = new \PHPExcel_Writer_Excel5($excel); header("Pragma: public"); header("Expires: 0"); header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); header("Content-Type:application/force-download"); header("Content-Type:application/vnd.ms-execl"); header("Content-Type:application/octet-stream"); header("Content-Type:application/download"); header('Content-Disposition:attachment;filename="' . $name . '.xls"'); header("Content-Transfer-Encoding:binary"); $write->save('php://output'); }
这三个方法我都亲测可用,欢迎拍砖。
注:因为使用了命名空间,这些第三方位于公共空间上,所以在实例化之前加上“\”即可解决