一、前言
线上好好运行的程序突然报错: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