Чтение файла excel xlsx с помощью simplexlsx в php

Я использую simplexlsx.class.php для чтения типа файла xlsx. Это создает проблемы, когда файл содержит поле даты в файле excel.

Пример вывода:

В файлах данных:

День Дата Четверг 2/2/2012 Пятница 2/3/2012

Выход программы:

Дата дня

Четверг 40941
Пятница 40942

Это не дает правильную дату

 <?php if (isset($_FILES['file'])) { require_once "simplexlsx.class.php"; $xlsx = new SimpleXLSX( $_FILES['file']['tmp_name'] ); echo '<h1>Parsing Result</h1>'; echo '<table border="1" cellpadding="3" style="border-collapse: collapse">'; list($cols,) = $xlsx->dimension(); foreach( $xlsx->rows() as $k => $r) { if ($k == 0) continue; // skip first row echo '<tr>'; for( $i = 0; $i < $cols; $i++) { echo '<td>'.( (isset($r[$i])) ? $r[$i] : '&nbsp;' ).'</td>'; } echo '</tr>'; } echo '</table>'; } ?> <h1>Upload</h1> <form method="post" enctype="multipart/form-data"> *.XLSX <input type="file" name="file" />&nbsp;&nbsp;<input type="submit" value="Parse" /> 

Это правильные даты, только во внутреннем формате Excel: количество дней с 1 января 1900 года (с учетом 1900 года – високосного года). Очевидно, что что-то в классе simplexlsx преобразует значение даты xlsx во внутренний формат Excel.

Я раньше не сталкивался с симплекссом (что меня удивляет, поскольку я думал, что знаю все библиотеки чтения / записи файлов Excel для PHP) … но где-то в коде должен быть метод обработки этого преобразования, поэтому я бы представьте, что также будет метод обратного (преобразование метки времени Excel в PHP)

РЕДАКТИРОВАТЬ

Метод, который вы хотите, находится в коде:

 function unixstamp( $excelDateTime ) { $d = floor( $excelDateTime ); // seconds since 1900 $t = $excelDateTime - $d; return ($d > 0) ? ( $d - 25569 ) * 86400 + $t * 86400 : $t * 86400; } 

Я не гарантирую, что это точно

ИЗМЕНИТЬ ДАЛЬШЕ

 function unixstamp( $excelDateTime ) { $d = floor( $excelDateTime ); // seconds since 1900 $t = $excelDateTime - $d; return ($d > 0) ? ( $d - 25569 ) * 86400 + $t * 86400 : $t * 86400; } $dateVal = 40941; $unixDateVal = unixstamp($dateVal); var_dump($unixDateVal); echo date('dM-Y',$unixDateVal); 

дает

 float 1328140800 

который выглядит замечательно как значение временной отметки unix в правильном диапазоне в этом году и, конечно же, достаточно:

 02-Feb-2012 

Так выглядит, что это работает для меня