Пользовательский формат ячейки PHPExcel отображается только после двойного щелчка - PullRequest
6 голосов
/ 16 июля 2010

Я столкнулся со странной проблемой установки пользовательского формата даты с помощью PHPExcel: я записываю в ячейку отформатированную дату sql и устанавливаю ее формат с помощью setFormatCode равным 'd / m / y'. Когда я открываю его в Excel 2007, он отображает формат даты orignial до тех пор, пока я дважды не щелкну ячейку, а затем он обновится до нужного мне формата. Есть ли способ заставить его освежиться без моей помощи?

$sheet->setCellValueByColumnAndRow($column, $row, '2010-07-16');
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH);

Ответы [ 2 ]

15 голосов
/ 17 июля 2010

Если вы не используете PHPExcel "Advanced Value Binder", тогда $ sheet-> setCellValueByColumnAndRow ($ column, $ row, '2010-07-16');будет сохранять значение как строку, а не как дату, поэтому формат даты, который вы устанавливаете в следующей строке, не имеет смысла, когда применяется к строке, пока вы не прочитаете результирующий файл в Excel и не выполните принудительное обновление ... Сам Excelзатем исправляет вашу ошибку.

Чтобы обеспечить правильное сохранение значения в первую очередь, вам нужно сохранить его как дату / время / число, а не строку, а затем установить маску формата, чтобы убедиться, что онообрабатывается как дата / время, а не как числовое значение.

Либо преобразуйте вашу строку в дату PHP с помощью strtotime (), затем используйте встроенные методы преобразования даты в PHPExcel:

$PHPDateValue = strtotime('2010-07-16');
$ExcelDateValue = PHPExcel_Shared_Date::PHPToExcel($PHPDateValue);
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

или используйте встроенный метод для преобразования строки в формате даты в значение даты / времени Excel напрямую

$dateString = '2010-07-16';
$ExcelDateValue = PHPExcel_Shared_Date::stringToExcel($dateString);
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

или используйте функцию DATEVALUE () библиотеки функций модулей расчета:

$dateString = '2010-07-16';
$ExcelDateValue = PHPExcel_Calculation_Functions::DATEVALUE($dateString);
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

или, вариант 4, заключается в использовании расширенного связующего значения в PHPExcel

Чтобы включить эту функцию, выполните следующий статический вызов

PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );

beпрежде чем создавать экземпляр объекта рабочей книги или загружать его из файла

, тогда PHPExcel определит, что ваше значение является датой, и обработает преобразование в дату / время в Excel и автоматически отформатирует

$dateString = '2010-07-16';
$sheet->setCellValueByColumnAndRow($column, $row, $dateString); 
1 голос
/ 08 ноября 2011

Я бы хотел добавить опцию 5 ...

Если вы хотите использовать это с SetValueExplicit, вы бы сделали это следующим образом:

\\convert bDate to dDate 
$dDate = PHPExcel_Shared_Date::PHPToExcel(strtotime($bDate));

\\must use type numeric
$worksheet->getCell($col_row)->setValueExplicit($dDate,PHPExcel_Cell_DataType::TYPE_NUMERIC);
\\use FORMAT_DATE of your choice i am using "YYYY-MM-DD"
$worksheet->getStyle($col_row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2);

Обратите внимание, что форматы даты в документации и в Интернете выглядят устаревшими. Полный список всех различных типов FORMAT_DATE_XYZ можно найти в файле PHPExcel \ Style \ Number_Format.php в вашей копии библиотеки.

Вероятно, проще всего использовать Advanced Value Binder, но если вы не можете или не хотите этого, надеюсь, эта информация была вам полезна.

...