В настоящее время я создаю программу для своей работы, которая использует 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()); }
Позвольте мне объяснить каждую строку.
Осталось решить, какие форматы даты записать значение в целевой файл 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
– любой формат, который вы хотите