【问题标题】:Read excel xlsx file using simplexlsx in php在php中使用simplexlsx读取excel xlsx文件
【发布时间】:2012-04-20 08:38:51
【问题描述】:

我正在使用simplexlsx.class.php 来读取 xlsx 文件类型。当文件在 excel 文件中包含日期字段时会出现问题。

示例输出:

在文件数据中:

日期 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" />

【问题讨论】:

    标签: php xlsx


    【解决方案1】:

    这些是正确的日期,只是 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;
    }
    

    我不保证它是准确的

    进一步编辑

    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
    

    所以看起来它对我有用

    【讨论】:

    • 不工作..我将日期字段发送到 unixstamp 函数它没有返回实际日期。
    • 几年后才发现只想提一下。该值可能是表示日期时间值的浮点数,例如 43540.101599456。当您在 Excel 中打开它时,它显示为“3/16/2019 2:26 AM”。将 date() 与此方法一起使用可能会给您不同的答案,因为这将尝试以本地时间格式化(Excel 显然不会这样做)。您可以通过使用gmdate('Y-m-d H:i:s',$unixDateVal); 获取与 Excel 匹配的值来解决此问题。
    • @khartnett - 43540.101599456 将是 MS Excel SErialized 时间戳,它与 Unix 时间戳不同...date()gmdate() 等函数使用 Unix 时间戳。它与当地时间无关,而与它们是完全不同类型的值、计算不同的时间间隔、具有完全不同的基点这一事实有关
    • @MarkBaker 您是说 MS Excel 序列化时间戳与您答案中的 $excelDateTime 不同吗?在您的答案中使用您的计算,我能够在计算时间(在 Excel 中打开时匹配)精确到分钟时得到正确的值。所以它们看起来肯定是相关的
    • 澄清一下,我并不是说 43540.101599456 是一个 unix 时间戳,它仍然是自 1900 年 1 月 1 日以来的天数。看来这种格式没有特定的时区,但将其转换为使用您的计算的 unix 时间戳将使其相对于 UTC 时区,并且使用 gmdate 将正确转换它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多