关于PHP文件Excel导入导出操作

PHPExcel使用

PHPExcel 中文使用手册详解--转载

PhpSpreadsheet使用
phpspreadsheet官方手册

使用PhpSpreadsheet将数据导出为Excel文件

谈一谈php://inputphp://output

谈一谈php://input和php://output0

PHPExecl 实例
    private function downExcel($excel=2003)
    {
        $this->autoLayout = false;
        $this->autoRender = false;
        set_time_limit(600);
        $query = array();
        if($this->Session->check('MonthlyTarget_AREAREQUEST_QUERY'))
        {
            $query = $this->Session->read('MonthlyTarget_AREAREQUEST_QUERY');
        }
        $this->loadModel('Dept');
        $this->loadModel('DeclarationForm');
        $conditions = $this->_performanceAreaFilter($query);
        $count = $this->MonthlyTarget->find('count',array('conditions'=>$conditions,'order'=>'MonthlyTarget.user_id'));
        if(!$count){
            $this->Session->setFlash('导出失败:未找到符合条件的内容或数据为空','default',array('class'=>'albox errorbox'));
            $this->redirect(array('controller'=>'MonthlyTargets','action'=>'Performance'));
        }

        //引入相关文件
        App::uses('PHPExcel','Vender/PHPExcel');
        App::uses('IOFactory','Vender/PHPExcel/PHPExcel');
        App::uses('Excel5','Vender/PHPExcel/PHPExcel/Writer');      //2003版excel
        App::uses('Excel2007','Vender/PHPExcel/PHPExcel/Writer');   //2007版excel

        //生成excel表格
        $resultPHPExcel = new PHPExcel();
        $sheet = $resultPHPExcel->getActiveSheet();

        //生成表头数据及格式
        $columnArr = range('A','L');//与表头字段相对应                                  //列字母A-V
        $titlesArr = array('年份','月份','区域','签约金额','到账金额','业绩金额','目标','签单完成率(%)','到账完成率(%)','到账人均单','业绩人均单','出单率(%)');    //表头
        $keysArr   = array('表头字段'); //表头对应字段名

        //生成查询数据
        $sheetDataMaxNum = 20000;           //设置项 单个sheet保存数据最大值
        $dataStartRow = 1;                  //设置项 第几行之后开始导入数据
        $limit = 5000;                      //设置项 每次查询5000条数据
        $allPages = ceil($count/$limit);    //总页数
        //统计行初始化
        $totalSignMoney = 0;//签约金额
        $totalRealSignMoney=0;//签约实际金额
        $totalIntoPrice = 0;//到账金额
        $totalPerformance = 0;//业绩金额
        $totalDeptTarget = 0;//目标金额
        for($i=1,$sheetDataNum=0; $i<=$allPages; $i++){
            //查询结果数组   数据量很大时  占用内存会很大   比如几万条  十几万条   所以做分批处理  及时释放内存
            $firstDeptIds = $this->_getFirstDeptIds();
            $area_depts = $this->Dept->find('list',array('conditions'=>array('id'=>$firstDeptIds),'fields'=>array('id','name'),'limit'=>$limit));
            $item = array();
            foreach($area_depts as $k=>$v){
                //区域业绩列表数据处理
                
                //统计行数据
                $num  = 1;
                $totalSignMoney += $item['MonthlyTarget']['total_sign_money'];  //区域累积签约金额
                $totalRealSignMoney += $item['MonthlyTarget']['total_real_sign_money'];  //区域累积签约实际金额
                $totalIntoPrice += $item['MonthlyTarget']['total_into_price'];   //区域累积到账金额
                $totalPerformance += $item['MonthlyTarget']['total_performance_money'];//区域累积业绩金额
                $totalDeptTarget += $item['MonthlyTarget']['dept_target'];//目标金额
                $deptSignMoneyFinishPercent = $totalDeptTarget>0 ? intval($totalSignMoney/$totalDeptTarget*100).'%':0;//签单完成率
                $deptIntoPriceFinishPercent = $totalDeptTarget>0 ? intval($totalIntoPrice/$totalDeptTarget*100).'%':0;//到账完成率

                $sheetDataNum++;
                $rownum = $sheetDataNum + $dataStartRow;                    //考虑excel2003最大65536行的限制(可以创建新的sheet,使用多个)
                //所有的单元格居中显示
                $sheet->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                foreach($columnArr as $key=>$colLetter){
                    $fields = explode('.',$keysArr[$key]);//分割字段名
                    $val = $item[$fields[0]][$fields[1]];//对应字段内容值
                    if($sheetDataNum > $sheetDataMaxNum){                   //一个sheet最大保存20000条数据
                        $sheet = $resultPHPExcel->createSheet();            //创建新的sheet
                        $sheetDataNum = 1; $rownum = $sheetDataNum + $dataStartRow;
                    }
                     //单元格赋值输出
                    $sheet->setCellValue($colLetter.$rownum,h($val));
                }
            }
            //统计行合并单元格并赋值
            $sheet->setCellValue('A'.intval($rownum+$num), '总计');
            $sheet->setCellValue('J'.intval($rownum+$num), '--');
            $sheet->setCellValue('C'.intval($rownum+$num), '--');
            $sheet->setCellValue('D'.intval($rownum+$num), $totalRealSignMoney);
            $sheet->setCellValue('E'.intval($rownum+$num), $totalIntoPrice);
            $sheet->setCellValue('F'.intval($rownum+$num), $totalPerformance);
            $sheet->setCellValue('G'.intval($rownum+$num), $totalDeptTarget);
            $sheet->setCellValue('H'.intval($rownum+$num), $deptSignMoneyFinishPercent);
            $sheet->setCellValue('I'.intval($rownum+$num), $deptIntoPriceFinishPercent);
            $sheet->mergeCells( 'A'.intval($rownum+$num).':'.'B'.intval($rownum+$num));
            $sheet->mergeCells( 'J'.intval($rownum+$num).':'.'L'.intval($rownum+$num));
            unset($item);
            //运行内存跳转,防止内存溢出(最高调整到1.125G)
            $memoryUsage = round(memory_get_usage(true)/1024/1024,3);
            $memoryLimit = ini_get('memory_limit');
            if($memoryLimit<=1024 && $memoryUsage/$memoryLimit > 0.9){              //当前内存使用超过限定值90% 并且限制值<1G 则限定值+128M
                ini_set('memory_limit',($memoryLimit+128).'M');
            }
        }
        //循环设置所有sheet的标题和表头等
        $allSheets = $resultPHPExcel->getAllSheets();
        foreach($allSheets as $index=>$oneSheet){
            $lastCol = $columnArr[count($columnArr)-1];
            $oneSheet->freezePaneByColumnAndRow(4,1);                           //冻结4列2行
            $oneSheet->getStyle('A1:'.$lastCol.'1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);  //对齐方式
            foreach($columnArr as $k=>$c){
                $oneSheet->setCellValue($c.'1',$titlesArr[$k]);                                                 //第二行设置为标头
            }
        }
        unset($allSheets);

        //导出文件
        $suffix = 'xls';
        $className = 'PHPExcel_Writer_Excel5';
        if($excel == 2007){
            $suffix = 'xlsx';
            $className = 'PHPExcel_Writer_Excel2007';
        }
        $outputFileName ='区域业绩列表'.date('Y-m-d H-i-s').'.'.$suffix;
        $xlsWriter = new $className($resultPHPExcel);
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:attachment;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( "php://output" );
        exit;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342