Чтение файла 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" />

Ответ 1

Это правильные даты, только во внутреннем формате 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('d-M-Y',$unixDateVal);

дает

float 1328140800

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

02-Feb-2012

Итак, похоже, что это работает со мной