我使用simplexlsx.class.php
来读取xlsx文件类型。当文件在excel文件中包含日期字段时,它会出现问题。
示例输出:
在文件数据中:
日期 2012年2月2日星期四 星期五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] : ' ' ).'</td>';
}
echo '</tr>';
}
echo '</table>';
}
?>
<h1>Upload</h1>
<form method="post" enctype="multipart/form-data">
*.XLSX <input type="file" name="file" /> <input type="submit" value="Parse" />
答案 0 :(得分: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
看起来它对我有用