Таблица PHPS: форматирование ячейки для времени также включает дату - PullRequest
2 голосов
/ 04 апреля 2020

Я пытаюсь отформатировать временную ячейку с использованием PHPSpreadsheet, но, похоже, она также включает дату при просмотре строки формул. Кажется также, что есть некоторые несоответствия при преобразовании из строки, объекта даты или времени unix.

<?php

include '../vendor/autoload.php';

use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$times = [
    '16:00:00',
    new \DateTime('16:00:00'),
    \strtotime('16:00:00'),
    '2020-04-04 16:00:00',
    new \DateTime('2020-02-04 16:00:00'),
    \strtotime('2020-02-04 16:00:00'),  
];

$format = \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_TIME1;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

foreach ($times as $i => $time) {
    $sheet->setCellValue('A' . ($i+1), \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($time));
    $sheet->getStyle('A' . ($i+1))->getNumberFormat()->setFormatCode($format);  
}

$writer = new Xlsx($spreadsheet);

$writer->save('test.xlsx');

Из \PHPOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_TIME1: const FORMAT_DATE_TIME1 = 'h:mm AM/PM';

Это ошибка или предназначена функциональность? Учитывая, что const FORMAT_DATE_DATETIME = 'd/m/yy h:mm'; включает некоторые параметры даты, я думаю, что что-то не так происходит.

Вот несколько скриншотов того, что происходит:

Formula bar showing included date

Но если мы введем «5:00 ​​AM» в ячейку, строка формулы не будет содержать дату:

Manually entered value does not include the date

Вот экран, который появляется при щелчке правой кнопкой мыши> «Форматировать ячейку»:

Format Cell screen

Может кто-нибудь сказать мне, если я что-то делаю неправильно, спасибо.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Я понял, как решить эту проблему: вам нужно вычислить представление временной метки в Excel, а затем получить только цифры после десятичного знака.

<?php

$timestamp = new \DateTime('16:00:00');
$excelTimestamp = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($timestamp);
$excelDate = floor($excelTimestamp);
$time = $excelTimestamp - $excelDate;

Из документации:

В Excel даты и время хранятся в виде чисел c, считая количество дней, прошедших с 1900-01-01. Например, дата «2008-12-31» представлена ​​как 39813. Вы можете проверить это в Microsoft Office Excel, введя эту дату в ячейку, а затем изменив формат чисел на «Общий», чтобы истинное значение цифры c раскрывается. Аналогично, «3:15 AM» представлен как 0,135417.

Я надеюсь, что это поможет всем, кто столкнулся с этой проблемой.

0 голосов
/ 06 апреля 2020

Вы должны установить правильный числовой формат, см. Для получения дополнительной информации официальный образец документации .

Заданный вами числовой формат 'h:mm AM/PM' означает, что дата не указана, только время. Когда вы переходите на 17:00, вы перезаписываете контент и будете использовать числовой формат. Если у вас будет дата, вы должны попытаться установить 'd/m/yy h:mm AM/PM'.

...