phpexcel设置AAA单元格,兼容大于702列数据

一、前言

      线上好好运行的程序突然报错:Invalid cell coordinate [A2 ,是个很偶然的错误,而且并不是整个下载功能都不能用了,只是当选择特定条件的时候才会报这个错,经过各种排查终于锁定了错误,鉴于这块可参考的文章不多,特此记录一下。

二、排查过程

1、检查格式发现无误

      本来以为是加上特定搜索条件后,代码格式出现了问题,或者数据格式不符合单元格规定,不过在各种对比之后,发现并不是数据格式问题,单元格要求还是很宽松的。

2、有事没事先百度

      百度发现有相同的错误,不过大家说的都是单元格到26列就会出错,但我这个是设置过AA的,也就是能承受最多26+26*26 = 702列数据 ,那么问题来了,到底现在生成的excel有多少行呢,从多少行开始就无法生成excel了呢?

3、测试生成数据列上限

      减少生成excel的数量,然后逐渐增加,发现写入excel的数据到ZZ之后就没了。也就是到了我设置的702列上限了,没有设置更多的表格所以多出来的数据就出错了。行叭,看来还需要扩展成AAA--ZZZ形式的才行啊。

4、关于单元格设置AA和设置AAA的方法

private function getCellKey($cellI)
    {
        $A = 65;
        if($cellI < 702) {
            $r = floor($cellI / 26);
            $l = $cellI % 26;
            if ($r == 0) {
                $cellPre = "";
            } else {
                $cellPre = chr($A + $r - 1);
            }
            $AStr = chr($A + $l);
            return $cellPre . $AStr;
        }else{
            $extraCellI = floor(($cellI -702) / 676);//第三列的第一个
            $centerCellI =  floor((($cellI -702) % 676) / 26);  //三列的第二列
            $dataCellI = (($cellI -702)  % 676) % 26;  //三列的第三列
            $cellPre = chr($A + $extraCellI);
            $center = chr($A + $centerCellI);
            $AStr = chr($A + $dataCellI);
            return $cellPre . $center . $AStr;
        }
    }
1$cellI 是循环数据的时候,传过来的数据列大小,就是根据这个数据列来进行判断。 
(2)设置AAA,关键是要注意702这个极限值,其次是对于ABC来说,BC的临界值是26*26 = 676
所以我这里设置的时候,是取676的余数
(3$A是设置为65,也就是A这个字母的ascii码,可以查看下:http://ascii.911cha.com/4)大家根据自己的逻辑设置就行,网上有很多设置AA这种形式的,代码各不一样,但是思路是一样的

5、效果图

在这里插入图片描述
      这里可以看到,设置完单元格之后,数据会从ZZ列直接过渡到AAA列,然后依次排序下去,这样就完美解决了问题。这段代码应该是没问题的,通过了大概的测试,如果大家有更好的代码,可以贴出来一起学习下,哈哈。

end

发布了359 篇原创文章 · 获赞 1350 · 访问量 130万+

猜你喜欢

转载自blog.csdn.net/LJFPHP/article/details/103284828