网站首页php

PHP导出导入excel类

发布时间:2016-03-24 01:47:22编辑:阅读(7318)

           

    1. 下载PHPExcel,  From链接: http://phpexcel.codeplex.com/releases/view/119187

    2. Excel导出数据组合函数:

          /**
          *生成execl内容
          *@param $expTitle 标题
          *@param $expCellName 列名
          *@param $expTableData 数据
          *@param $objExcel PHPExcel 对象
          *
          *Return $objExcel PHPExcel 对象
          **/
        function makeExcel($expTitle,$expCellName,$expTableData,$objExcel){        
            $objProps = $objExcel->getProperties();       
            $objProps->setCreator($expTitle);
            $objProps->setTitle($expTitle);
            $objProps->setSubject($expTitle);
            $objExcel->setActiveSheetIndex(0);
            $objActSheet = $objExcel->getActiveSheet();
            $objActSheet->setTitle($expTitle);
                    
            $cellNum = count($expCellName);
            $dataNum = count($expTableData);
            $cellName = 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','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT',
            'AU','AV','AW','AX','AY','AZ');
            $objExcel->getActiveSheet()->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
            $objExcel->getActiveSheet()->setCellValue('A1', $expTitle.' 生成时间:'.date('Y-m-d H:i:s'));//合并单元格生成标题
                
            for($i=0;$i<$cellNum;$i++){
                   $objExcel->getActiveSheet()->setCellValueExplicit($cellName[$i].'2', $expCellName[$i][1], 
                   PHPExcel_Cell_DataType::TYPE_STRING);
            } 
            for($i=0;$i<$dataNum;$i++){
                   for($j=0;$j<$cellNum;$j++){
                    $objExcel->getActiveSheet()->setCellValueExplicit($cellName[$j].($i+3), 
                    $expTableData[$i][$expCellName[$j][0]], PHPExcel_Cell_DataType::TYPE_STRING);
                   }             
            } 
            return $objExcel;
        }


    3.在程序中调用导出excel:

    public function actionexportExcel(){        
            require_once('Excel/PHPExcel.php');       
            require_once('Excel/PHPExcel/Writer/Excel5.php');  
            //require('Excel/PHPExcel/Writer/Excel2007.php'); //使用Excel2007导出.xlsx文件
            
            $objExcel  = new PHPExcel();       
            $objWriter  = new PHPExcel_Writer_Excel5($objExcel); 
            //$objWriter    =new PHPExcel_Writer_Excel2007($objExcel);        
            $cellname  = array(
                            array('id','ID'),
                            array('name','用户名'),
                            array('phone','手机'),
                            array('email','邮箱'),
                            array('addtime','注册时间'),
                        );
            $dbo   =   new Db();
            $dataset=  $dbo->getAll("SELECT id,name,phone,email,additm from FROM w_user LIMIT 0,100");
            
            $objExcel    = makeExcel('导出人员', $cellname, $dataset, $objExcel);
            $outputFilePath = "Upload/";
            $outputFileName  = "Members" . date('YmdHis') . ".xls";
            //$outputFileName  = "Members" . date('YmdHis') . ".xlsx"; //使用Excel2007导出.xlsx文件
            $objWriter->save($outputFilePath . $outputFileName);
            
            /**下载文件**/
            Header("Content-type: application/octet-stream");
            Header("Accept-Ranges: bytes");
            Header("Accept-Length: ".filesize($outputFilePath . $outputFileName));
            Header("Content-Disposition: attachment; filename=" . $outputFileName);
            $file = fopen($outputFilePath . $outputFileName,"r");
            echo fread($file,filesize($outputFilePath . $outputFileName));
            fclose($file);
        }


    4.excel导入数据组合函数

    function excelToArray($filename, $encode='utf-8'){
        require_once('Excel/PHPExcel.php');
        
        $objExcel  = new PHPExcel();
        $objReader = PHPExcel_IOFactory::createReader('Excel5');    //or Excel2007
        $objReader->setReadDataOnly(true);
        $objPHPExcel= $objReader->load($filename);
        $objWorksheet= $objPHPExcel->getActiveSheet();
        $highestRow= $objWorksheet->getHighestRow(); 
        $highestColumn= $objWorksheet->getHighestColumn(); 
        $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); 
        $excelData= array(); 
        /***跳过第一行标题栏***/
        for ($row = 2;$row<=$highestRow;$row++) { 
            for($col=0; $col<$highestColumnIndex; $col++) { 
                $excelData[$row][] = strval($objWorksheet->getCellByColumnAndRow($col, $row)->getValue());
            } 
        }
        return $excelData;
    }
    或者:
    function excelToArray($path)  {
            $type = 'Excel2007';//设置为Excel5代表支持2003或以下版本,Excel2007代表2007版  
            $xlsReader = PHPExcel_IOFactory::createReader($type);    
            $xlsReader->setReadDataOnly(true);  
            $xlsReader->setLoadSheetsOnly(true);  
            $Sheets = $xlsReader->load($path);  
            //开始读取上传到服务器中的Excel文件,返回一个二维数组
            $dataArray = $Sheets->getSheet(0)->toArray();  
            return $dataArray;
    }


    5.在程序中处理上传excel文件,导入数据。

    public function doimportjiaolianAction(){
        if (! empty( $_FILES ['file_excel'] ['name'] ))
        {
            $tmp_file = $_FILES ['file_stu']['tmp_name'];
            $file_types = explode ( ".", $_FILES ['file_stu']['name'] );
            $file_type = $file_types [count ( $file_types ) - 1];
            /*判别是不是.xls或者.xlsx文件,判别是不是excel文件*/
            if (strtolower ( $file_type ) != "xls" && strtolower ( $file_type ) != "xlsx")
            {
                js_msg( '不是Excel文件,重新上传', 'history.back()' );
            }
            /*设置上传路径*/
            $inputFilePath = $config['uploadpath'] . '/Excel/';
            $inputFileName  = "Order" . date('YmdHis') . $file_type;
            /*是否上传成功*/
            if (! copy ($tmp_file, $inputFilePath . $inputFileName )) 
            {
                js_msg( '上传失败', 'history.back()' );
            }
            /*
             * 对上传的Excel数据进行处理生成编程数据,这个函数会在下面第三步的ExcelToArray类中
             * 注意:这里调用执行了第三步类里面的read函数,把Excel转化为数组并返回给$res,再进行数据库写入
            */
            $res = $this->excelToArray( $inputFilePath . $inputFileName );
            if(empty($res)){
                js_msg('未找到数据', 'history.back()');
            }
            /*对生成的数组进行数据库的写入*/
            foreach ( $res as $k => $v ) 
            {
                    $name= $v[1];
                    $phone= $v[2];
                    $email= $v[3];
                    $addtime= $v[4];
                    $rows=array(
                        'name'=>$name,
                        'phone'=>$phone,
                        'email'=>$email,
                        'addtime'=>$addtime,
                    );
                    if (!(new Table('user'))->add($rows)) {
                        js_msg( '导入数据库失败' );
                    }    
            }
            js_msg( '导入数据成功', '', '/user.html' );
        }else{
            js_msg( '上传未成功.', 'history.back()' );
        }
    }


    处理可以加上数据校验,及校验结果预览,确定无误后再入库。


    -------------------------华丽丽的分割线------------------------


    1, composer引入phpoffice

    composer require phpoffice/phpspreadsheet


    2, 导入导出方法封装

    use PhpOffice\PhpSpreadsheet\Cell\DataType;
    use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
    use PhpOffice\PhpSpreadsheet\Style\Color;
    use PhpOffice\PhpSpreadsheet\IOFactory;
    
    private function importExcel($file, $sheet = 0, $jumpTo = 2) {
    	try {
    		if (!file_exists($file)) {
    			throw new \Exception('文件不存在!');
    		}
    		$objRead = IOFactory::createReader('Xlsx');
    		if (!$objRead->canRead($file)) {
    			$objRead = IOFactory::createReader('Xls');
    			if (!$objRead->canRead($file)) {
    				throw new \Exception('只支持导入Excel文件!');
    			}
    		}
    		$objRead->setReadDataOnly(true);
    		$obj = $objRead->load($file);
    		/* 获取指定的sheet表 */
    		$currSheet = $obj->getSheet($sheet);
    		if (isset($options['mergeCells'])) {
    			/* 读取合并行列 */
    			$options['mergeCells'] = $currSheet->getMergeCells();
    		}
    		/* 取得最大的列号 */
    		$columnH = $currSheet->getHighestColumn();
    		/* 兼容原逻辑,循环时使用的是小于等于 */
    		$columnCnt = Coordinate::columnIndexFromString($columnH);
    		/* 获取总行数 */
    		$rowCnt = $currSheet->getHighestRow();
    		$data = [];
    		/* 读取内容 */
    		for ($_row = $jumpTo; $_row <= $rowCnt; $_row++) {
    			$isNull = true;
    			for ($_column = 1; $_column <= $columnCnt; $_column++) {
    				$cellName = Coordinate::stringFromColumnIndex($_column);
    				$cellId = $cellName . $_row;
    				$cell = $currSheet->getCell($cellId);
    				if (isset($options['format'])) {
    					/* 获取格式 */
    					$format = $cell->getStyle()->getNumberFormat()->getFormatCode();
    					/* 记录格式 */
    					$options['format'][$_row][$cellName] = $format;
    				}
    				$data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());
    				if (!empty($data[$_row][$cellName])) {
    					$isNull = false;
    				}
    			}
    			if ($isNull) {
    				unset($data[$_row]);
    			}
    		}
    		return $data;
    	} catch (\Exception $e) {
    		dump($e->getMessage());
    	}
    }
    
    private function exportExcel($title, $data = [], $path = '') {
    	$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
    	$sheet = $spreadsheet->getActiveSheet();
    	$colcounter = count($title);
    	$idx = array_key_first($data);
    	$keys = $data ? array_keys($data[$idx]) : 0;
    	for ($i = 1; $i <= $colcounter; $i++) {
    		$sheet->setCellValue(Coordinate::stringFromColumnIndex($i) . '1', $title[$i - 1]);
    	}
    	$sheet->getStyle('A1:' . Coordinate::stringFromColumnIndex($i) . '1')->getFont()->setBold(true)->setColor((new Color)->setRGB('ff0000'));
    	foreach ($data as $index => $row) {
    		for ($j = 1; $j <= $colcounter; $j++) {
    			$sheet->setCellValueExplicit(Coordinate::stringFromColumnIndex($j) . ($index + 2), $row[$keys[$j - 1]], DataType::TYPE_STRING);
    		}
    	}
    	for ($k = 1; $k <= $colcounter; $k++) {
    		$sheet->getColumnDimension(Coordinate::stringFromColumnIndex($k))->setAutoSize(true);
    	}
    	$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
    	$writer->save($path);
    	$spreadsheet->disconnectWorksheets();
    	unset($spreadsheet);
    }


    3, 使用方法

    //使用方法
    public function exportorderAction()
    {
            try {
                $file = '/path/to/excel/file.xlsx';
                $data = $this->importExcel($file, 0, 1);
                dump($data);
                $title = [
                    'ID', '编号', '类型', '用户', '地址', '总价', '...'
                ];
                $newfile = '/path/to/excel/export.xlsx';
                $this->exportExcel($title, $data, $newfile);
                $result = [
                    'ret' => 0,
                    'msg' => '操作成功'
                ];
            } catch (Exception $e) {
                $result = [
                    'ret' => 30001,
                    'msg' => $e->getMessage(),
                ];
            }
            json($result);
    }


        




评论