一、前言
線上好好運行的程序突然報錯: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