【问题标题】:PHPExcel: how to set date format for a cellPHPExcel:如何为单元格设置日期格式
【发布时间】:2016-08-13 13:38:38
【问题描述】:

我需要将日期保存到 Excel 文件中,它必须以“dd/mm/yyyy”格式(或用户的本地日期格式)输出,并被视为日期,以便它们的一列可以正确排序。

代码如下:

<?php
include_once("../PHPExcel/Classes/PHPExcel.php");
date_default_timezone_set('Europe/London');
$objPHPExcel = new PHPExcel();
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

$objPHPExcel = new PHPExcel();
$sheet = $objPHPExcel->getActiveSheet();
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

//I didn't find dd/mm/yyyy format, so I used yyyy-mm-dd
$sheet->setCellValueByColumnAndRow(0, 1, "2014-10-16");
$sheet->getStyleByColumnAndRow(0, 1)
    ->getNumberFormat()->setFormatCode(
        PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2
);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save("test.xlsx");

它创建了一个文件,但我看到的不是本地日期格式:“2014-10-16”,单元格的格式是“所有格式”->“yyyy-mm-dd”。我希望以我的本地日期格式对其进行解析和输出。

查看PHPExcel/Classes/PHPExcel/Style/NumberFormat.php的源码,发现很多日期格式:

const FORMAT_DATE_YYYYMMDD2 = 'yyyy-mm-dd';
const FORMAT_DATE_YYYYMMDD = 'yy-mm-dd';
const FORMAT_DATE_DDMMYYYY = 'dd/mm/yy';
const FORMAT_DATE_DMYSLASH = 'd/m/y';
const FORMAT_DATE_DMYMINUS = 'd-m-y';
...

但我不确定该使用什么。我怎样才能达到预期的目标?

【问题讨论】:

    标签: php date formatting phpexcel


    【解决方案1】:

    此代码生成 4 个日期格式的单元格。

    <?php
    include_once("../PHPExcel/Classes/PHPExcel.php");
    date_default_timezone_set('Europe/London');
    $objPHPExcel = new PHPExcel();
    $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
    PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
    
    $objPHPExcel = new PHPExcel();
    $sheet = $objPHPExcel->getActiveSheet();
    PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
    
    $format = 'dd/mm/yyyy';
    for ($i = 1; $i < 5; ++$i)
    {
        $date = new DateTime('2016-12-0'.$i);
        $sheet->setCellValueByColumnAndRow(0, $i, 
                                           PHPExcel_Shared_Date::PHPToExcel( $date ));
    
        $sheet->getStyleByColumnAndRow(0, $i)
            ->getNumberFormat()->setFormatCode($format);
    }
    
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter->save("test.xlsx");
    

    【讨论】:

    • 在调用PHPExcel_Shared_Date::PHPToExcel()之前,您不需要将DateTime对象转换为Unix时间戳......您可以将DateTime对象传递给PHPExcel_Shared_Date::PHPToExcel()而不是时间戳
    • @MarkBaker 我更新了答案。当我尝试将字符串 '2016-12-01' 传递给 PHPExcel_Shared_Date::PHPToExcel 时,就像您展示的那样,它不起作用。
    • 那么您在 PHPExcel 中发现了一个只有您以前遇到过的主要错误。 PHPExcel_Shared_Date::PHPToExcel() 将接受 unix 时间戳、DateTime 对象或 PHP 内置 strtotime() 函数将识别的格式的字符串,'2016-12-01' 是一个完全有效的字符串....我刚刚测试过它我自己用这个值,它完全按预期工作
    • @MarkBaker 也许,我有一个过时的版本:我的库是从 2012 年开始的?
    • 1.8.1 是最新的生产版本,从 2015 年 4 月 30 日开始;虽然开发分支也很稳定
    【解决方案2】:
    $sheet->setCellValueByColumnAndRow(0, 1, "2014-10-16");
    

    在单元格中设置 字符串 值,而不是日期。仅仅因为您将其解释为日期,并不意味着计算机程序会自动将其解释为日期。

    查看 PHPExcel DocumentationExamples 中的日期示例,您会看到需要将单元格值设置为 MS Excel 序列化时间戳(自 1 月 1 日以来的天数的浮点值1900)。您可以使用 PHPExcel_Shared_Date::PHPToExcel() 等 PHPExcel 函数将人类日期/PHP DateTime 对象/Unix 时间戳转换为 MS Excel 序列化时间戳。

    $sheet->setCellValueByColumnAndRow(0, 1, PHPExcel_Shared_Date::PHPToExcel( '2014-10-16' ));
    

    将值存储为时间戳后,您可以将所需的任何日期格式掩码应用于该单元格以获得所需的格式

    【讨论】:

    • 在 xdebug PHPExcel_Shared_Date::PHPToExcel( )) 中总是显示数字,不明白。它是否以某种方式编码为数字?我在我的电子表格中看到一些单元格有格式日期,它们显示日期,但有些有格式而不是日期,并显示这个功能输出编号。这是为什么呢?
    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多