【问题标题】:PHPExcel taking format of empty cellsPHPExcel采用空单元格的格式
【发布时间】:2014-10-02 13:34:48
【问题描述】:

在我之前将整个第一列格式化为日期的 Excel 工作表中,后来我将使用的单元格的格式更改为常规(单元格 A1 到 A11)。因此,从单元格 A12 开始,第一列仍然具有以前的日期格式。 当我尝试使用第一列(A1、A2、...、A11)的值时,它会将它们的格式识别为日期,并给出错误的结果。

例如,这会返回日期格式(d/mm/yyyy),但情况并非如此(见图)

$sheet->getStyle('A3')->getNumberFormat()->getFormatCode();

整个专栏也有这种格式:

$sheet->getStyle('A')->getNumberFormat()->getFormatCode();    

有没有办法确保单元格本身的格式得到考虑? (当我明确指出这个单元格的格式时,使用了正确的格式)

经过一番调查,发现这个问题只出现在 .xlsx 文件(使用阅读器 PHPExcel_Reader_Excel2007),而不是 .xls 文件(阅读器 PHPExcel_Reader_Excel5)。

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    您可以设置整行/列格式:

    $sheet->getStyle('A')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
    

    因为你只把A1的格式改成了A11,剩下的还是老格式。所以设置整列/行的格式可以解决这个问题

    【讨论】:

    • 感谢您的回复。试过这个(有效): $sheet->getStyle('A1:A20')->getNumberFormat()->setFormatCode('General');但是应该有一个通用的方法来做到这一点(我的意思是:采用单元格的实际格式而不是强加“通用”格式)
    • 嗯,是的,这是我的解决方案,但它只设置了所有 A* 单元格的格式。 setFormatCode 也从常量中获取样式,很好用。
    【解决方案2】:

    经过一番调查,在阅读器 Excel2007.php 中发现了可能的原因。

    设置样式时条件有问题(第933行):

    if ($c["s"] && !$this->_readDataOnly) {
      $cell->setXfIndex(isset($styles[intval($c["s"])]) ? intval($c["s"]) : 0);
    }
    

    在通用单元格格式的情况下,$c["s"] 没有定义,也没有设置单元格的_xfIndex(不通过if语句)。这给存储的单元格的 _xfIndex 带来了问题(我没有找到原因)。

    移除 $c["s"] 条件时,设置正确的样式。

    if (/*$c["s"] &&*/ !$this->_readDataOnly) {
      $cell->setXfIndex(isset($styles[intval($c["s"])]) ? intval($c["s"]) : 0);
    }
    

    希望没有隐藏的后果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多