HINKPHP3.2.3整合PHPexcel实现数据的导入导出。可以上传excel文件后批量导入到数据库,兼容.xls和.xlsx格式;数据库里的数据可以按照搜索条件和分页导出为excel文件。
最近接了一个小活,客户要求实现既可以手工录入数据又可以excel文件上传后批量导入到数据库,要求兼容.xls和.xlsx格式;数据库里的数据可以按照搜索条件和分页导出为excel文件。比较麻烦的是excel里的一个机型字段是一对多的,即一个产品对应多个机型,是按照逗号分隔的,导入时要先将机型分隔成数组,然后再判断该机型是否存在,不存在就插入到机型表里,存在则获取到该机型对应的id,然后将id用逗号拼接成字符串存入数据库中。特将代码公开,以方便大家学习。
源码里包含PHPExcel组件,一个控制器文件和一个视图文件,PHPExcel和PHPExcel.class.php放入thinkphp的Library/Org/Util/目录下。
一:去官网http://phpexcel.codeplex.com/下载最新PHPExcel
文件存放
ExcelReader类:
<?php namespace Lib; import("Org.Util.PHPExcel"); import("Org.Util.PHPExcel.Reader.Excel5"); import("Org.Util.PHPExcel.Reader.Excel2007"); class ExcelReader { /** * 读取excel * @param unknown_type $excelPath:excel路径 * @param unknown_type $allColumn:读取的列数 * @param unknown_type $sheet:读取的工作表 */ public static function reader_excel($excelPath, $allColumn = 0, $sheet = 0) { $excel_arr = array(); //默认用excel2007读取excel,若格式 不对,则用之前的版本进行读取 $PHPReader = new PHPExcel_Reader_Excel2007(); if(!$PHPReader->canRead($excelPath)) { $PHPReader = new PHPExcel_Reader_Excel5(); if(!$PHPReader->canRead($excelPath)) { //返回空的数组 return $excel_arr; } } //载入excel文件 $PHPExcel = new PHPExcel(); $PHPExcel = $PHPReader->load($excelPath); //获取工作表总数 $sheetCount = $PHPExcel->getSheetCount(); //判断是否超过工作表总数,取最小值 $sheet = $sheet < $sheetCount ? $sheet : $sheetCount; //默认读取excel文件中的第一个工作表 $currentSheet = $PHPExcel->getSheet($sheet); if(empty($allColumn)) { //取得最大列号,这里输出的是大写的英文字母,ord()函数将字符转为十进制,65代表A $allColumn = ord($currentSheet->getHighestColumn()) - 65 + 1; } //取得一共多少行 $allRow = $currentSheet->getHighestRow(); //从第二行开始输出,因为excel表中第一行为列名 for($currentRow = 2; $currentRow <= $allRow; $currentRow++) { for($currentColumn = 0; $currentColumn <= $allColumn - 1; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $excel_arr[$currentRow - 2][$currentColumn] = $val; } } //返回二维数组 return $excel_arr; } } ?>
导出
$resultPHPExcel = new PHPExcel(); //设置参数 //设值 $resultPHPExcel->getActiveSheet()->setCellValue('A1', 'id'); $resultPHPExcel->getActiveSheet()->setCellValue('B1', '省'); $resultPHPExcel->getActiveSheet()->setCellValue('C1', '市'); $resultPHPExcel->getActiveSheet()->setCellValue('D1', '区'); $i = 2; foreach($data as $item){ $resultPHPExcel->getActiveSheet()->setCellValue('A' . $i, $item['id']); $resultPHPExcel->getActiveSheet()->setCellValue('B' . $i, $item['province']); $resultPHPExcel->getActiveSheet()->setCellValue('C' . $i, $item['city']); $resultPHPExcel->getActiveSheet()->setCellValue('C' . $i, $item['district']); $i ++; } //设置导出文件名 $outputFileName = 'total.xls'; $xlsWriter = new PHPExcel_Writer_Excel5($resultPHPExcel); //ob_start(); ob_flush(); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-Disposition:inline;filename="'.$outputFileName.'"'); header("Content-Transfer-Encoding: binary"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); $xlsWriter->save("20160623.xls");