CI框架导出多个mysql查询结果到excel多个sheet表 各大量数据导入(数以万计)

mysql表结构


 

导出各班成绩到不同sheet表

 public function testPHPExcel(){
    	set_time_limit(0);//防止超时
    	ini_set("memory_limit","512M");//防止内存过大

        //加载PHPExcel的类
        $this->load->library('PHPExcel');
        $this->load->library('PHPExcel/IOFactory');
        //创建PHPExcel实例
        $excel = new PHPExcel();

    	/*获取数据库数据*/
    	$banji = $this->db->select('BanJi')->group_by('BanJi')->get('chengji_xuexiao_wenke')->result_array();
    	foreach ($banji as $key => $vbj) {
    		if($key !== 0) $excel->createSheet();
	        $excel->setactivesheetindex($key);
	        /** 设置工作表名称 */
	        $excel->getActiveSheet($key)->setTitle($vbj['BanJi']);
	        //下面介绍项目中用到的几个关于excel的操作
	        $charActors = 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');	//用到的列
	        $widthSize = array(5, 10, 10, 10, 5,5,10,10,5,10,10,5,10,10,5,10,10,5,10,10,5,10,10,5,10,10);	//列宽
	        $titleName = array('姓名', '考号', '学号','学校','班级','总分','总分联考排名','总分学校排名','语文','语文联考排名','语文学校排名','数学','数学联考排名','数学学校排名','英语','英语联考排名','英语学校排名','政治','政治联考排名','政治学校排名','历史','历史联考排名','历史学校排名','地理','地理联考排名','地理学校排名');
	        //写入表头
	        foreach ($charActors as $k => $v) {
	        	//加粗
	        	$excel->getActiveSheet()->getStyle('A1:Z1')->getFont()->setBold(true);
	            //对齐方式,水平居中
	            $excel->getActiveSheet()->getStyle('A1:Z1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
	            $excel->getActiveSheet()->getStyle($v)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
	            //设置表格宽度
	            $excel->getActiveSheet()->getColumnDimension($v)->setWidth($widthSize[$k]);
	            //设置单元格为文本
	            $excel->getActiveSheet()->getStyle($v)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
	            //为单元格赋值
	            $excel->getActiveSheet()->setCellValue($v . 1, $titleName[$k]);
	        }

    		$xuexiao = $this->db->where('BanJi',$vbj['BanJi'])->get('chengji_xuexiao_wenke')->result_array();
	        $hangshu = 2;//从第二行开始写入数据    行数
	        //p($xuexiao);
	        foreach ($xuexiao as $vxx) {
	        	$excel->getActiveSheet()->setCellValue('A' . $hangshu, $vxx['XingMing']);
	            $excel->getActiveSheet()->setCellValue('B' . $hangshu, $vxx['KaoHao']);
	            $excel->getActiveSheet()->setCellValue('C' . $hangshu, $vxx['XueHao']);
	        	$excel->getActiveSheet()->setCellValue('D' . $hangshu, $vxx['XueXiao']);
	            $excel->getActiveSheet()->setCellValue('E' . $hangshu, $vxx['BanJi']);
	            $excel->getActiveSheet()->setCellValue('F' . $hangshu, $vxx['ZongFen']);
	        	$excel->getActiveSheet()->setCellValue('G' . $hangshu, $vxx['ZongFenLianKaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('H' . $hangshu, $vxx['ZongFenXueXiaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('I' . $hangshu, $vxx['YuWen']);
	        	$excel->getActiveSheet()->setCellValue('J' . $hangshu, $vxx['YuWenLianKaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('K' . $hangshu, $vxx['YuWenXueXiaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('L' . $hangshu, $vxx['ShuXue']);
	        	$excel->getActiveSheet()->setCellValue('M' . $hangshu, $vxx['ShuXueLianKaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('N' . $hangshu, $vxx['ShuXueXueXiaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('O' . $hangshu, $vxx['YingYu']);
	        	$excel->getActiveSheet()->setCellValue('P' . $hangshu, $vxx['YingYuLianKaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('Q' . $hangshu, $vxx['YingYuXueXiaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('R' . $hangshu, $vxx['ZhengZhi']);
	        	$excel->getActiveSheet()->setCellValue('S' . $hangshu, $vxx['ZhengZhiLianKaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('T' . $hangshu, $vxx['ZhengZhiXueXiaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('U' . $hangshu, $vxx['LiShi']);
	        	$excel->getActiveSheet()->setCellValue('V' . $hangshu, $vxx['LiShiLianKaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('W' . $hangshu, $vxx['LiShiXueXiaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('X' . $hangshu, $vxx['DiLi']);
	            $excel->getActiveSheet()->setCellValue('Y' . $hangshu, $vxx['DiLiLianKaoPaiMing']);
	            $excel->getActiveSheet()->setCellValue('Z' . $hangshu, $vxx['DiLiXueXiaoPaiMing']);
	            $hangshu++;
	        }

    	}
        //输出
	    $excel->setactivesheetindex(0);/** 设置第一个工作表为活动工作表 */
        $write = new PHPExcel_Writer_Excel2007($excel);
        $file_name = '文科各班成绩表';
        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="' . $file_name . '.xlsx"');
        header("Content-Transfer-Encoding:binary");
        $write->save('php://output');
    }

附:可能出现超时和内存过大情况

Maximum execution time of 30 seconds exceeded,

简单总结一下解决办法:

报错一:内存超限,具体报错语句忘了,简单说一下解决办法。

利用循环分批导入;

每个循环内部开始处使用sleep(5);语句,做延迟执行,防止服务器内存同一时间占用过多,里面数字据情况修改;

每个循环内部结束地方使用 ob_flush();刷新输出缓冲

flush();将当前为止程序的所有输出发送到用户的浏览器

两者必须同时使用来刷新输出缓冲

报错二:30秒运行超时的错误(Maximum execution time of 30 seconds exceeded)

解决办法:

方法一,修改php.ini文件

max_execution_time = 30; Maximum execution time of each script, in seconds

把它设置成需要的值就可以了。如果设置成0的话,就是永不过期。

方法二,修改php执行文件(推荐

加上

<?

set_time_limit(0);

?>

max_execution_time = 30; Maximum execution time of each script, in seconds

把它设置成需要的值就可以了。如果设置成0的话,就是永不过期。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in 

出现该错误的原因:

是因为php页面消耗的最大内存默认是为 8M (在PHP的ini件里可以看到) ,如果文件太大 或图片太大 在读取的时候 会发生上述错误。

解决办法:

1,修改 php.ini
将memory_limit由 8M 改成 16M(或更大),重启apache服务

2,在PHP 文件中 加入 ini_set(”memory_limit”,”100M”);(推荐

注意:为了系统的其它资源的正常使用 请您不要将 memory_limit设置太大,其中-1为不限

3,修改.htaccess 文档(前提是该目录支持.htaccess)
在文档中新增一句:php_value memory_limit 16M(或更大)

导入

public function daoruwen(){
        set_time_limit(0);//防止超时
        ini_set("memory_limit","512M");//防止内存过大        

        //处理上传的文件
        $config['upload_path'] = './';
        $config['allowed_types'] = 'xls';
        $config['max_size'] = '200000';
        $config['max_width'] = '2000';//1280*407
        $config['max_height'] = '2000';
        $config['max_filename'] = '40';
        $config['encrypt_name'] = false;
        $this->load->library('upload',$config);
        if ( ! $this->upload->do_upload('myfile')){
               /*p($this->upload->display_errors());*/
                echo "<script>alert('文件上传不成功!');window.history.back(-1)</script>";
        }else{
            //上传成功后处理
            $filedata = $this->upload->data();
            $filename = $filedata['file_name'];
            //$filePath = base_url().'public/'.$filename;
            $filePath = $filename;

            $this->load->library('PHPExcel');
            $this->load->library('PHPExcel/IOFactory');
            //创建PHPExcel实例
            $excel = new PHPExcel();

            $objReader = IOFactory::createReader('Excel5');//use excel2007 for 2007 format 
            $objPHPExcel = $objReader->load($filePath); //$filename可以是上传的文件,或者是指定的文件
            $sheet = $objPHPExcel->getSheet(0); 
            $highestRow = $sheet->getHighestRow(); // 取得总行数 
            $highestColumn = $sheet->getHighestColumn(); // 取得总列数
            //$k = 0; 

            //循环读取excel文件,读取一条,插入一条
            for($rowCurrent=2;$rowCurrent<=$highestRow;$rowCurrent++)
            {
                $a = $objPHPExcel->getActiveSheet()->getCell("A".$rowCurrent)->getValue();//获取A列的值
                $b = $objPHPExcel->getActiveSheet()->getCell("B".$rowCurrent)->getValue();//获取B列的值
                $c = $objPHPExcel->getActiveSheet()->getCell("C".$rowCurrent)->getValue();//获取C列的值
                $d = $objPHPExcel->getActiveSheet()->getCell("D".$rowCurrent)->getValue();//获取D列的值
                $e = $objPHPExcel->getActiveSheet()->getCell("E".$rowCurrent)->getValue();//获取A列的值
                $f = $objPHPExcel->getActiveSheet()->getCell("F".$rowCurrent)->getValue();//获取B列的值
                $g = $objPHPExcel->getActiveSheet()->getCell("G".$rowCurrent)->getValue();//获取C列的值
                $h = $objPHPExcel->getActiveSheet()->getCell("H".$rowCurrent)->getValue();//获取D列的值
                $i = $objPHPExcel->getActiveSheet()->getCell("I".$rowCurrent)->getValue();//获取A列的值
                $j = $objPHPExcel->getActiveSheet()->getCell("J".$rowCurrent)->getValue();//获取B列的值
                $k = $objPHPExcel->getActiveSheet()->getCell("K".$rowCurrent)->getValue();//获取C列的值
                $l = $objPHPExcel->getActiveSheet()->getCell("L".$rowCurrent)->getValue();//获取D列的值
                $m = $objPHPExcel->getActiveSheet()->getCell("M".$rowCurrent)->getValue();//获取A列的值
                $n = $objPHPExcel->getActiveSheet()->getCell("N".$rowCurrent)->getValue();//获取B列的值
                $o = $objPHPExcel->getActiveSheet()->getCell("O".$rowCurrent)->getValue();//获取C列的值
                $p = $objPHPExcel->getActiveSheet()->getCell("P".$rowCurrent)->getValue();//获取D列的值
                $q = $objPHPExcel->getActiveSheet()->getCell("Q".$rowCurrent)->getValue();//获取A列的值
                $r = $objPHPExcel->getActiveSheet()->getCell("R".$rowCurrent)->getValue();//获取B列的值
                $s = $objPHPExcel->getActiveSheet()->getCell("S".$rowCurrent)->getValue();//获取C列的值
                $t = $objPHPExcel->getActiveSheet()->getCell("T".$rowCurrent)->getValue();//获取D列的值
                $u = $objPHPExcel->getActiveSheet()->getCell("U".$rowCurrent)->getValue();//获取A列的值
                $v = $objPHPExcel->getActiveSheet()->getCell("V".$rowCurrent)->getValue();//获取B列的值
                $w = $objPHPExcel->getActiveSheet()->getCell("W".$rowCurrent)->getValue();//获取C列的值
                $x = $objPHPExcel->getActiveSheet()->getCell("X".$rowCurrent)->getValue();//获取D列的值
                $y = $objPHPExcel->getActiveSheet()->getCell("Y".$rowCurrent)->getValue();//获取C列的值
                $z = $objPHPExcel->getActiveSheet()->getCell("Z".$rowCurrent)->getValue();//获取D列的值
                $this->db->insert('chengji_quanshi_wenke',array('XingMing'=>$a,'KaoHao'=>$b,'XueHao'=>$c,'XueXiao'=>$d,'BanJi'=>$e,'ZongFen'=>$f,'ZongFenLianKaoPaiMing'=>$g,'ZongFenXueXiaoPaiMing'=>$h,'YuWen'=>$i,'YuWenLianKaoPaiMing'=>$j,'YuWenXueXiaoPaiMing'=>$k,'ShuXue'=>$l,'ShuXueLianKaoPaiMing'=>$m,'ShuXueXueXiaoPaiMing'=>$n,'YingYu'=>$o,'YingYuLianKaoPaiMing'=>$p,'YingYuXueXiaoPaiMing'=>$q,'ZhengZhi'=>$r,'ZhengZhiLianKaoPaiMing'=>$s,'ZhengZhiXueXiaoPaiMing'=>$t,'LiShi'=>$u,'LiShiLianKaoPaiMing'=>$v,'LiShiXueXiaoPaiMing'=>$w,'DiLi'=>$x,'DiLiLianKaoPaiMing'=>$y,'DiLiXueXiaoPaiMing'=>$z));
                
            }
            success('导入成功!',site_url('home/showquanshiwen'));
        }      

猜你喜欢

转载自blog.csdn.net/luyi_c/article/details/87652389
今日推荐