PHPExcel:如何设置单元格的日期格式

PHPExcel: how to set date format for a cell

我需要保存一个日期到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”,单元格的格式是 "All formats" -> "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';
...

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

$sheet->setCellValueByColumnAndRow(0, 1, "2014-10-16");

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

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

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

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

此代码生成 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");