Мне нужно сохранить дату в файл 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 = 'dm-y'; ...
Но я не уверен, что использовать. Как я могу достичь желаемой цели?
$sheet->setCellValueByColumnAndRow(0, 1, "2014-10-16");
Устанавливает строковое значение в ячейке, а не дату. Просто потому, что вы интерпретируете это как дату, не означает, что компьютерные программы автоматически интерпретируют его как дату.
Посмотрите пример даты в документации и примерах PHPExcel, и вы увидите, что вам нужно установить значение ячейки в сериализованную временную метку MS Excel (значение с плавающей точкой числа дней с 1 января 1900 года). Вы можете использовать функции PHPExcel, такие как PHPExcel_Shared_Date::PHPToExcel()
для преобразования человеческих дат / объектов PHP DateTime / временных меток 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");