如何在php中动态生成Excel列号?

时间:2015-01-25 21:22:02

标签: php

我正在写excel& amp;有一个动态的列数,即我不知道在运行查询之前需要多少列,所以我需要动态分配列号,如下所示:

$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'value')
->setCellValue('A2', 'value')
->setCellValue('B2', 'value')
->setCellValue('C2', 'value')
//...etc...
->setCellValue('AA2', 'value')
->setCellValue('AB2', 'value')
->setCellValue('AC2', 'value')
//...etc...

我怎么能用PHP做到这一点?

更新

抱歉,列命名模式为:

A,B,C,.. AA,AB,AC ...... BA,BB,BC ......等,数字后缀实际上是行。并且不,'值实际上将从某些查询数据设置填充,我的值看起来更像:

$i=1;
while($result= $query->fetch_assoc()){

->setCellValue($col.$i, $result['whatever'])
$i++;

}

我只是不知道如何让列字母在该模式中递增。

5 个答案:

答案 0 :(得分:1)

优化功能

function columnFromIndex($number){
    if($number === 0)
        return "A";
    $name='';
    while($number>0){
        $name=chr(65+$number%26).$name;
        $number=intval($number/26)-1;
        if($number === 0){
            $name="A".$name;
            break;
        }
    }
    return $name;
}

答案 1 :(得分:0)

如果你不知道你将提前使用多少列/行,你怎么能期望以这种方式使用流畅的界面?

在您编辑问题后,您可能会执行以下操作:

$i = 1;
while($result = $query->fetch_assoc()){
    $col = 'A';
    foreach($result as $value) {
        $objPHPExcel->getActiveSheet()->setCellValue($col++.$i, $value);
    }
    $i++;
}

但是,您可以考虑采用其他方法,并使用fromArray()方法填充数据

$i = 1;
while($result = $query->fetch_assoc()){
    $objPHPExcel->getActiveSheet()->fromArray('A'.$i++, $result);
}

答案 2 :(得分:0)

可能太晚了,我不知道是否有更好的解决方案,但是,我使用此递归函数来解决此问题

    private function getLastColumn($last){ //last represent how mouch X axis spaces 
                                           //you want to jump
        $max = 26; //Max characters (in number) that you cant jump, ('z´)
        $inicial = 'A';
        $col = '';
        if ($last > $max) //if last is bigger than last you should recall the function
        {
            $last = $last - $max; //discount the max to the last
            $letterAscii = ord($inicial); //tansform the charcter to to number
            $letterAscii += ($last - 1); // add last -1(-1 to stay in A to keep the 
                                         //base 1)
            $col = chr($letterAscii);    // int to ascci
            $col = $col.$this->getLastColumn($last); // recall the funcion and concat 
                                                    //the result
        }else{
            $letterAscii = ord($inicial); // same as adove
            $letterAscii += ($last - 1);
            $col = chr($letterAscii);   //only pass the result to col

        }
        
        return $col;                     //return coll
    
}

如果需要正确的27个空格,则会得到'AA'

如果有更好的解决方案请告诉我:)

答案 3 :(得分:0)

最简单的答案是

use PhpOffice\PhpSpreadsheet\Cell\Coordinate;

echo Coordinate::stringFromColumnIndex(5) // return E
echo Coordinate::columnIndexFromString('AA') // returns 27 

答案 4 :(得分:0)

我认为为时已晚,但对于我的片段 我做了这个功能,

function number_to_column($num) {
        $column_name = array();         
        for($i=0;$i<=$num;$i++) {
            $numeric = $i % 26;
            $letter = chr(65 + $numeric);
            $num2 = intval($num / 26);
            if ($num2 > 0) {
                if($i<26) {
                    $v_column = $letter;
                } 
                if($i>25 && $i<52) {
                    $v_column = 'A'.$letter;
                } 
                if($i>51) {
                    $v_column = 'B'.$letter;
                }
                $column_name[] = $v_column;
            } else {
                $v_column = $letter;
                $column_name[] = $v_column;
            }
        }
        return $column_name;
    }

那么我们就可以这样使用了

$column_name = number_to_column(count($array[0])-1); 

$column_name 将产生 excel 行名称,