2012-04-20 179 views
10

我使用simplexlsx.class.php來讀取xlsx文件類型。當文件在excel文件中包含日期字段時會出現問題。在php中使用simplexlsx讀取excel xlsx文件

輸出示例:

在文件中的數據:

日日期 週四2012/2/2 週五2012年2月3日

程序輸出:

日期日期

週四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" /> 

+0

代碼請... – Baba 2012-04-20 08:55:22

回答

11

這些都是正確的日期,只是在Excel的內部格式:天數自1900年1月1日(允許1900年是閏年)。顯然,simplexlsx類中的某些東西是將xlsx日期值轉換爲Excel內部格式。

我之前沒有遇到過simplexlsx(這讓我感到驚訝,因爲我知道我知道PHP的所有Excel文件讀取器/編寫器庫)......但是代碼中的某處必須有一個方法來處理該轉換,所以我想像,有也將是反向的方法(將Excel的時間戳PHP)

編輯

你想用的方法中的代碼:

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

我做n O保證其準確性

EDIT進一步

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 

所以看起來像它的工作s給我

+0

不工作..我把日期字段發送到unixstamp函數它沒有返回實際日期。 – MAK 2012-04-20 10:03:48

+0

感謝的標記它的工作知道.. – MAK 2012-04-21 04:54:39

+0

感謝您的功能 – 2012-09-17 12:00:21