Site Loader

LOCATION

VanY_Y

   今天遇到一个关于导出excel表的问题,原因是因为导出的数据列数超过26列,为什么超过26列就会报错呢,因为execl表的抬头标示是从A-Z的,所以超过26位之后,会用[/^等等标识符进行标示.其实这些标识符是有规则的,这些是根据ASCII码进行编排的.

下面我们来看看完善的代码

protected function getExcel($fileName,$headArr,$data,$keys){
            //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
            import("Think.ORG.PHPExcel");
            import("Think.ORG.PHPExcel.Writer.Excel5");
            import("Think.ORG.PHPExcel.IOFactory.php");
            $fileName .= ".xls";

            //创建PHPExcel对象
            $objPHPExcel = new PHPExcel();
            
            //设置表头
            $key = ord("A");
            foreach($headArr as $key1 => $v){
                //判断是否超过26列
                if ($key1 <= 25) {
                    $colum = chr($key);
                }else{
                    if (chr($key) == '[') {
                        $key = ord("A");
                    }
                    $colum  = chr(64+$key1/26).chr($key);
                }
                $columArr[] = $colum; 
                $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
                ++$key;
            }
            $column = 2;
            $objActSheet = $objPHPExcel->getActiveSheet();
            foreach($data as $key => $rows){ //行写入
                $span = ord("A");
                $i=1;
                foreach($rows as $keyName=>$value){// 列写入
                    $j = $columArr[$keyName];   //判断第i个为时间戳时间
                    if ($keys==$i) {
                        $objActSheet->setCellValue($j.$column,date('Y-m-d',$value));
                    }else{
                        $objActSheet->setCellValue($j.$column,$value);
                    }
                    
                    $span++;
                    $i++;
                }
                $column++;
            }
            $fileName = iconv("utf-8", "gb2312", $fileName);
            //设置活动单指数到第一个表,所以Excel打开这是第一个表
            $objPHPExcel->setActiveSheetIndex(0);
            header('Content-Type: application/vnd.ms-excel');
            header("Content-Disposition: attachment;filename=\"$fileName\"");
            header('Cache-Control: max-age=0');

            $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
            $objWriter->save('php://output'); //文件通过浏览器下载
            exit;
}

以上代码是我一个项目中的一部分代码,关于列数超过26个报错的.之前我的代码是这样的

直接读取头部信息然后重置excel的表头,所以超过26个的时候没做处理,直接就报错了,下面我处理后的代码是这样的

从上面我们可以看出,当$key1(默认值为0)大于25的时候,新增了一个$key变量,将A字母的ASCII码赋值给$key,每次遍历++$key;这样就可以获取从A-Z的字母了.

关于用$key1/26是为了获取当前轮数,再加上64(A字母的ASCII码是65),再加上chr($key)就可以组合成,AA,AB,AC,AD形式的新抬头标示了.最后附上字符的ASCII表

Post Author: Vany

我是一个喜欢追求技术的小伙,在大学开始之前,自己还是一个电脑白痴,对于电脑,只会开关机,但是由于自己的兴趣,我在选专业的时候,全部选择了计算机专业,其实我也不知道为什么这样不顾家人的反对去做这个决定。上了大学后,我在大一的时候开始接触计算机硬件,设计的领域包括了电脑维修,系统封装等等。在大二的时候,我才开始接触PHP,一开始的时候还不是很懂,也没什么资源,所以学习只能靠老师讲一些特别基础的东西。在大二的一段时间,自己对服务器特别感兴趣,但是资源问题,只能自己慢慢研究,后来通过各种百度,通过翻墙获得了自己的第一个域名,.top域名。后来还弄了一个免费的虚拟空间,在结合域名,我自己弄了一个静态的个人网站。大三的时候,我在网上找到兄弟连这个网站,网站上面有一些免费的视频,特别适合新人看。从那以后,我一直在看教学视频去提高自己的能力,在后来,经过面试八连碰壁,才发现自己之前学的是那么肤浅,而且工作也没有自己想象的那么简单,但是高兴的是,目前工作的那家公司录用了我,在这个公司我真的学会了很多东西,包括一些cms网站的建设啊,微商城开发啊,还有最让自己兴奋的就是微信接口的开发等等这些。即使学了不少东西,但有些时候还是会觉得自己还是个小白,所以我必须不断的提升自己

发表评论

电子邮件地址不会被公开。