phpexcel封装函数setExcelField()不支持大于26列

derek 2017-08-22 15:16:58

然之对PHPExcel开源插件进行了自己的二次封装,使其适应然之系统中常用的导出功能,文件位置:lib\excel\excel.class.php。其依赖于原生的PHPExcel插件(lib\phpexcel 文件夹)。

但lib\excel\excel.class.php类中的setExcelField()不支持大于26列(传参$count大于25)的情况。此函数的作用时求$count+1列的列名。

原有函数如下图(lib\excel\excel.class.php  第366行),可以看到,如果大于26列,得到的结果就会从小写a继续往下读取ASCII码值。但是excel中实际情况确实AA,AB……这样表示。

修复函数如下:(替换原有函数)

    public function setExcelField($count)
    {
        $_count = $count + 1;
        $more = "";
        if (($_count / 26) > 1){
            $more = $this->setExcelField(floor($_count / 26) - 1);
            $count = ($_count % 26) - 1;
        }
        
        $letter = 'A';
        for($i = 1; $i <= $count; $i++) $letter++;
        return $more . $letter;
    }

截图如下:

代码基于然之开源版4.4

回帖列表
liugang 2017-08-23 13:22:22

你遇到的问题可能是其他原因导致的。专业版2.3发布时对开源版中的excel.class.php做了修复。至少下面这段代码,在php5.5.9和7.0.4的环境下,运行结果都是AA,而不是a。


<?php

$count  = 26; 

$letter = 'A';

for($i = 0; $i < $count; $i++) $letter++;

echo $letter . "\n";




条件限制,没有测试更多的php版本,但php5+应该不会有出入。



derek 2017-08-23 12:04:47
我用的是开源版本4.4,开源版全部只有csv格式,是不涉及上述文件的。但是我在二次开发的过程中用到过这个函数,会出现我描述的问题。我只能是把代码分析一下。至少,$letter++这种方式时不对的,php会自动把字符按照ascii码进行++运算,ascii码Z之后是a,而不是Z之后是AA。
liugang 2017-08-23 11:06:33

有具体的问题页面吗?我们使用的过程中超过26列可以正常导出。


BeeRanzhi 2017-08-22 17:47:46
谢谢反馈,我们记录下。
1/ 1
鲁ICP备18054969号
ZSITE8.6