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

PHPExcel 中,可以使用 `getStyle()` 方法获取单元格的样式对象,然后使用 `getNumberFormat()` 方法获取该单元格的数字格式。然后,可以使用 `setFormatCode()` 方法将日期格式应用于单元格。 以下是一个示例代码,演示如何将单元格的日期格式设置为 "yyyy-mm-dd": ```php // 加载 PHPExcel 库 require_once 'PHPExcel.php'; // 创建一个新的 Excel 对象 $objPHPExcel = new PHPExcel(); // 设置活动工作表 $objPHPExcel->setActiveSheetIndex(0); $worksheet = $objPHPExcel->getActiveSheet(); // 设置日期值 $date = new DateTime('2021-07-01'); // 将日期值设置单元格中 $cell = 'A1'; $worksheet->setCellValue($cell, $date); // 获取单元格的样式对象 $style = $worksheet->getStyle($cell); // 获取单元格的数字格式 $format = $style->getNumberFormat()->getFormatCode(); // 设置日期格式 $style->getNumberFormat()->setFormatCode('yyyy-mm-dd'); // 输出 Excel 文件 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('example.xlsx'); ``` 在上面的示例代码中,我们首先创建了一个新的 Excel 对象,并设置了活动工作表。然后,我们创建了一个 `DateTime` 对象,将其设置为 "2021-07-01",并将其值设置单元格 A1 中。接下来,我们获取了单元格 A1 的样式对象,并使用 `getNumberFormat()` 方法获取该单元格的数字格式。然后,我们使用 `setFormatCode()` 方法将日期格式设置为 "yyyy-mm-dd"。最后,我们将 Excel 文件保存到本地文件系统中。 这样,单元格 A1 的日期格式就被设置为 "yyyy-mm-dd" 了。你可以根据需要修改日期格式的代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值