phpexcel封装函数setExcelField()不支持大于26列
2017-08-22 15:16:58
杨桢
  • 访问次数: 59
  • 注册日期: 2017-06-29
  • 最后登录: 2017-11-09
  • 当前积分: 1830
  • 门派等级: 释迦 等级2 沙弥

然之对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

沙发
2017-08-22 17:47:46
然之-Bee
  • 访问次数: 1070
  • 注册日期: 2017-02-22
  • 最后登录: 2019-01-16
  • 当前积分: 2579
  • 门派等级: 无门派
谢谢反馈,我们记录下。
板凳
2017-08-23 11:06:33
刘刚
  • 访问次数: 656
  • 注册日期: 2015-12-02
  • 最后登录: 2019-01-13
  • 当前积分: 4960
  • 门派等级: 玄清 等级3 真人

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

#3
2017-08-23 12:04:47
杨桢
  • 访问次数: 59
  • 注册日期: 2017-06-29
  • 最后登录: 2017-11-09
  • 当前积分: 1830
  • 门派等级: 释迦 等级2 沙弥
我用的是开源版本4.4,开源版全部只有csv格式,是不涉及上述文件的。但是我在二次开发的过程中用到过这个函数,会出现我描述的问题。我只能是把代码分析一下。至少,$letter++这种方式时不对的,php会自动把字符按照ascii码进行++运算,ascii码Z之后是a,而不是Z之后是AA。
#4
2017-08-23 13:22:22
刘刚
  • 访问次数: 656
  • 注册日期: 2015-12-02
  • 最后登录: 2019-01-13
  • 当前积分: 4960
  • 门派等级: 玄清 等级3 真人

你遇到的问题可能是其他原因导致的。专业版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+应该不会有出入。


刚哥 最后编辑, 2017-08-23 13:23:27
1/1