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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章