PHPExcel, дата не обрабатывается неправильно

В настоящее время я создаю программу для своей работы, которая использует PHPexcel, чтобы в основном взять все данные с листа excel, сделать новый лист Excel и отформатировать его для текста и перенести все данные со старого листа excel.

Мой php должен иметь возможность принимать значения из старого листа excel и правильно разбирать их, особенно даты / числа / и т. Д.

Все работает отлично, за исключением дат. По какой-то причине, когда я получаю форматированное значение ячейки; он не соответствует формату даты на первом листе. В частности, значение, подобное этому: 12/31/2099. По какой-то причине он неправильно считывает формат format как mm-dd-yy и выдает 12-31-99. Это очень неприятно, и я отвел половину Интернета за ответ. Помоги пожалуйста; Я не уверен, в чем проблема! Код:

<?php $spreadSheet=$_FILES["filebrowser"]["tmp_name"]; /** PHPExcel_IOFactory */ require_once 'Classes/PHPExcel/IOFactory.php'; require_once 'Classes/PHPExcel/Shared/Date.php'; $objReader = PHPExcel_IOFactory::createReader('Excel2007'); //Create temporary sheet from uploaded file data $objPHPExcel = $objReader->load($spreadSheet); $sheet = $objPHPExcel->getActiveSheet(); $sheet->setTitle("Original Data"); $data=$sheet->getCell("D9")->getFormattedValue(); var_dump($data); exit;?> 

D9 – ячейка с форматом DATE и значением 12/31/2099. Этот код печатает 12-31-99 …

Использование PHPExcel v1.7.9

Откройте файл «PHPExcel \ Style \ NumberFormat.php»

Перейдите к строке 278:

 self::$_builtInFormats[22] = 'm/d/yy h:mm'; 

заменить

 self::$_builtInFormats[22] = 'dd-mm-yyyy hh:mm'; 

или любой другой формат, который вы хотите.

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

Используя v1.7.8 и предполагая, что Excel2007 aka .xlsx file

 $a1Cell = $sheet->getCell('A1'); $a1CellFormattedValue = trim($a1Cell->getFormattedValue()); if (!empty($a1CellFormattedValue)) { $dateInTimestampValue = PHPExcel_Shared_Date::ExcelToPHP($a1Cell->getValue()); } 

Позвольте мне объяснить каждую строку.

  • строка 1 – получить объект Cell
  • строка 2 и блок if, так что мы выполняем только для непустых ячеек
  • строка 4 – это то, как мы преобразуем значение внутри ячейки в временную метку unix.

Осталось решить, какие форматы даты записать значение в целевой файл excel. Мое предложение состоит в том, что вы решаете с заинтересованными сторонами, что ВСЕ даты в целевых файлах excel будут следовать определенному формату.

Это самый чистый способ, о котором я могу думать.

PS Если у вас пустая ячейка, и вы пытаетесь выполнить PHPExcel_Shared_Date::ExcelToPHP по значению ячейки, вы получите текущую дату.

ОБНОВИТЬ

Просто понял, что в ваших комментариях упоминается, что вы не можете произвольно решить формат. Извини за это. Если я встречу что-то, что поможет, я обновлю этот ответ.

Я только что наткнулся на ваш вопрос. если вы знаете формат, в котором Excel сохраняет дату, то вы можете использовать класс PHP DateTime в качестве промежуточного представления даты

 $data=$sheet->getCell("D9")->getFormattedValue(); $date = DateTime::createFromFormat ("mdy" , $data); $string_date = $date->format($format); 

где $format – любой формат, который вы хотите