web-dev-qa-db-ja.com

PHPExcel:セルの日付形式を設定する方法

日付を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';
...

しかし、私は何を使うべきかわかりません。どうすれば望ましい目標を達成できますか?

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

日付ではなく、セルにstring値を設定します。あなたがそれを日付として解釈するからといって、コンピュータープログラムがそれを日付として自動的に解釈することを意味するのではありません。

PHPExcelの日付の例 Documentation および Examples を確認すると、セルの値をMS Excelのシリアル化されたタイムスタンプ(float値)に設定する必要があることがわかります1900年1月1日からの日数)。 PHPExcel_Shared_Date::PHPToExcel()のようなPHPExcel関数を使用して、人間の日付/ PHP DateTimeオブジェクト/ UnixタイムスタンプをMS Excelシリアル化タイムスタンプに変換できます。

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

タイムスタンプとして値を保存したら、そのセルに必要な日付フォーマットマスクを適用して、目的のフォーマットを取得できます。

5
Mark Baker

このコードは、日付形式で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");
5
user4035