phpexcel導出超過26列解決方案

原文:phpexcel導出超過26列解決方案php

 

將列的數字序號轉成字母使用,代碼以下:
 html

PHPExcel_Cell::stringFromColumnIndex($i); // 從o,1,2,3,..開始,相應返回返回 A,B,C,...Z,AA,AB,...

 

將列的字母轉成數字序號使用,代碼以下:數組

 
PHPExcel_Cell::columnIndexFromString('AA');
 
 
使用phpexcel導出excel文件的時候,發現報了一個錯誤,後來查詢問題才發現是列數超過26列的問題。原先的代碼:
 
//$content是一個須要導出的數組
$maxColumn = count($content[0]);
$maxRow    = count($content);
for ($i = 0; $i < $maxColumn; $i++) {
    for ($j = 0; $j < $maxRow; $j++) {
        $pCoordinate = chr(65+$i) . '' . ($j + 1);
        $pValue      = $content[$j][$i];
        $objPHPExcel->getActiveSheet()->setCellValue($pCoordinate, $pValue);
    }
}
代碼中只是將列直接轉換爲字母,沒有考慮到超過26列的狀況,超過26列後,chr(65+$i)就變成「[」符號了。
 
excel行列表示方式
 
excel的列的表示規則從A,B,C一直到Z,當超過26個字母的時候用兩個字母進行表示:AA,AB,AC...AZ,BA,BB,BC...BZ...,當超過702時又是另一個種表示方法。
 
行的表示就是1,2,3,4,5,6,7....這樣下去。在phpexcel中要設一個單元格的值經過setCellValue方法就能夠了,其中第一個參數表示列和行的拼接的值,如:A1,B1,AA1,BA1這樣。
 
改進方法
 
知道這個以後,只要根據$i/26的整數部分和模部分計算出列的表示字母就能夠了。固然phpexcel早就考慮到這個問題了,因此呢不用本身計算,只須要直接調用PHPExcel_Cell類中的stringFromColumnIndex方法就能夠了。
 
/**
 *     String from columnindex
 *
 *     @param    int $pColumnIndex Column index (base 0 !!!)
 *     @return    string
 */
public static function stringFromColumnIndex($pColumnIndex = 0) {
    //    Using a lookup cache adds a slight memory overhead, but boosts speed
    //    caching using a static within the method is faster than a class static,
    //        though it's additional memory overhead
    static $_indexCache = array();
 
    if (!isset($_indexCache[$pColumnIndex])) {
        // Determine column string
        if ($pColumnIndex < 26) {
            $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);
        } elseif ($pColumnIndex < 702) {
            $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) .
                    chr(65 + $pColumnIndex % 26);
        } else {
            $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex – 26) / 676)) .
                    chr(65 + ((($pColumnIndex – 26) % 676) / 26)) .
                    chr(65 + $pColumnIndex % 26);
        }
    }
    return $_indexCache[$pColumnIndex];
}
能夠看出這個方法針對26列內,26到702列,超過702列都進行了處理,最後就是返回A、B、C、AA、AB這樣的字符。對一開始的錯誤代碼改進一下:
 
//$content是一個須要導出的數組
$maxColumn = count($content[0]);
$maxRow    = count($content);
for ($i = 0; $i < $maxColumn; $i++) {
    for ($j = 0; $j < $maxRow; $j++) {
        $pCoordinate = PHPExcel_Cell::stringFromColumnIndex($i) . '' . ($j + 1);
        $pValue      = $content[$j][$i];
        $objPHPExcel->getActiveSheet()->setCellValue($pCoordinate, $pValue);
    }
}
 
 
from: http://www.01happy.com/phpexcel-column-more-than-26/
相關文章
相關標籤/搜索