Я использую 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] : ' ' ).'</td>'; } echo '</tr>'; } echo '</table>'; } ?> <h1>Upload</h1> <form method="post" enctype="multipart/form-data"> *.XLSX <input type="file" name="file" /> <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
Так выглядит, что это работает для меня