10

私はsimplexlsx.class.phpxlsxファイルタイプを読むために使用しています。ファイルに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" />

4

1 に答える 1

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

正確であることを保証するものではありません

さらに編集

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

だから私にはうまくいくようです

于 2012-04-20T09:08:22.557 に答える