2012-04-20 27 views
10

Używam simplexlsx.class.php, aby przeczytać typ pliku xlsx. Daje problemy, gdy plik zawiera pole daty w pliku excel.Przeczytaj excel pliku xlsx za pomocą simplexlsx w php

wyjście Próbka:

w danych pliku:

Dzień Data czwartek 02.02.2012 piątek 2/3/2012

wyjście Program:

Data dnia

czwartek 40941
piątek 40942

To nie dać poprawną datę

<?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" /> 

+0

kod proszę ... – Baba

Odpowiedz

11

Są poprawne daty, tylko w wewnętrznym formacie Excel: liczba dni od Jan 1 1900 (z uwzględnieniem 1900 to rok przestępny). Najwyraźniej coś w klasie simplexlsx konwertuje wartość daty xlsx do wewnętrznego formatu Excela.

Nie natknąłem się na simplexlsx wcześniej (co mnie zaskakuje, ponieważ wydawało mi się, że znam wszystkie biblioteki programów czytających/piszących dla PHP) ... ale gdzieś w kodzie musi być metoda obsługi tej konwersji, tak bym sobie wyobrazić, że nie będzie również sposób na odwrocie (konwersja Excel timestamp PHP)

EDIT

Sposób chcesz to w kodzie:

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

I zrobić n o gwarancje, że to dokładne

EDIT INNE

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); 

daje

float 1328140800 

który wygląda zupełnie jak Unix wartości znacznika czasu w prawidłowym zakresie w tym roku i na pewno wystarczy:

02-Feb-2012 

Wygląda na to, że działa s do mnie

+0

Nie działa..i wysyła pole daty do funkcji unixstamp, która nie zwraca rzeczywistej daty. – MAK

+0

Znak podziękowania, że ​​działa, wiem ... – MAK

+0

Dzięki za funkcję –

Powiązane problemy