PHPExcel中的自定义日期格式

PHPExcel中的自定义日期格式,php,phpexcel,strtotime,Php,Phpexcel,Strtotime,在我的excel文件中,我从PHP构建的第一行是标题行。我需要把几个日期作为列标题。每个日期(以dd/mm/yyyy格式)为15/mm/yyyy,从2007年1月15日开始,到2018年12月15日结束,逐月递增。 我的代码是: for($anno = $annoMin; $anno<=$annoMax; $anno++){ for($mese = 1; $mese <= 12; $mese++){ $mese = sprintf("%02s", $mese)

在我的excel文件中,我从PHP构建的第一行是标题行。我需要把几个日期作为列标题。每个日期(以dd/mm/yyyy格式)为15/mm/yyyy,从2007年1月15日开始,到2018年12月15日结束,逐月递增。 我的代码是:

for($anno = $annoMin; $anno<=$annoMax; $anno++){
    for($mese = 1; $mese <= 12; $mese++){
        $mese = sprintf("%02s", $mese);
        $periodo = '15/'.$mese.'/'.$anno;
        $periodo = strtotime($periodo);
        $periodo = PHPExcel_Shared_Date::PHPToExcel($periodo);
        array_push($header_array,$periodo);
    }
}
最后,我将有日期的单元格格式化为:

$ews->getStyle('U1:EJ1')
    ->getNumberFormat()
    ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DDMMYYYY);
问题是:

  • 实际上,我的代码为每个带有日期的单元格返回“False”
  • 我需要添加一个未在PHPExcel库中列出的自定义掩码:MM/YYYY,以显示在每个单元格中 对于第一个问题:我已经检查了不同的SO问题,并进行了跟踪。没有运气。

    问题在于:

    $periodo = '15/'.$mese.'/'.$anno;
    $periodo = strtotime($periodo);
    
    这将给出一个字符串值
    15/1/2015
    15/2/2015
    ``2015年12月15日
    您正试图使用
    strotime()转换为unix时间戳

    如果您阅读
    strotime()
    函数使用的字符串,您将看到
    /
    分隔符告诉PHP日期字符串是US date格式。。。。i、 e.mm/dd/yyyy
    在每种情况下都给出一个月值
    15',当然,没有第15个月

    使用破折号(
    -
    )而不是
    /
    来表示欧洲(
    dd-mm-yyyy
    )而不是美国日期格式

    $periodo = '15-'.$mese.'-'.$anno;
    $periodo = strtotime($periodo);
    
    或者重新排序值以使用US格式

    $periodo = $mese.'/'.'15/'.$anno;
    $periodo = strtotime($periodo);
    

    关于你问题的第二部分。。。。您可以提供MS Excel识别的几乎任何格式掩码,而不限于内置格式;因此:

    $ews->getStyle('U1:EJ1')
        ->getNumberFormat()
        ->setFormatCode('mm/yyyy');
    

    格式代码只是一个字符串值

    侧注:我可以去掉单元格中的时间吗?我在公式栏中看到的值是这样的:“14/01/2008 23:00:00”,我只想看到“14/01/2008”?请确保您使用的是GMT/UTC。。。。通过设置时区;或者您可以选择使用
    gmmktime()
    gmdate()
    而不是
    strotime()
    ;或者改为使用PHP的DateTime对象和UTC DateTimeZone
    $ews->getStyle('U1:EJ1')
        ->getNumberFormat()
        ->setFormatCode('mm/yyyy');