在PHP EXCEL中读取日期格式

18

我使用 PHP Excel 读取了 Excel 文件。

但是该 Excel 文件包含一些日期(时间格式),PHP Excel 对于这种情况返回错误的值。

我的代码如下:

enter code hereinclude 'Classes/PHPExcel/IOFactory.php';

$inputFileName = 'index.xlsx';

//  Read your Excel workbook
try {
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    $objPHPExcel = $objReader->load($inputFileName);
} catch (Exception $e) {
    die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME)
        . '": ' . $e->getMessage());
}

//  Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();

//  Loop through each row of the worksheet in turn
for ($row = 1; $row <= $highestRow; $row++) {
    //  Read a row of data into an array
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row,
        NULL, TRUE, FALSE);

    foreach ($rowData[0] as $k => $v)
        echo "Row: " . $row . "- Col: " . ($k + 1) . " = " . $v . "<br />";
}

有谁可以帮忙吗? PHPExcel中是否有针对这种情况的特定函数。

我的输入Excel文件如下所示:

2013-12-12, 2013-12-13

我的输出结果如下所示:

41621, 41631

有一些方法来将日期格式的输出数据转换吗?

5个回答

40
当您使用PHPExcel_Reader_Excel5库读取xls文件时,文件中的数据为39984,但Excel使用日期格式掩码将其格式化为“2009-06-20”?
Excel将日期保存为自1900年1月1日以来的天数计数(在Windows 1900年日历上)。 PHPExcel以相同的方式存储其日期,但不会自动为您格式化它们。
您可以使用PHPExcel_Style_NumberFormat :: toFormattedString(39984,PHPExcel_Style_NumberFormat :: FORMAT_DATE_DDMMYYYY)或任何其他格式掩码在PHPExcel_Style_NumberFormat 中自行格式化它们,或者将其转换为PHP日期并使用PHP的 date()函数按您所需的方式进行格式化。
示例:
$val = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($cell->getValue()));

1
哦,这段文字说“Excel将日期保存为自1900年1月1日以来的天数计数(在Windows 1900日历上)。PHPExcel以相同的方式存储其日期,但不会自动为您格式化它们。” - murrometz
1
@pnuts 是的,看起来我应该同意你的观点。你想说的是,41621、41631 不是正确的值,对吗? - murrometz
@pnuts,我发了一个回答。 - user4272288
@pnuts 不是,是针对你的问题回答:“41621和41631代表哪些日期?- pnuts 2015年9月17日上午8:26” - user4272288
如何使完整的年份显示出来? - Fernando Torres

22

另一种方法是使用gmdate:

$excel_date = 43010; //here is that value 41621 or 41631
$unix_date = ($excel_date - 25569) * 86400;
$excel_date = 25569 + ($unix_date / 86400);
$unix_date = ($excel_date - 25569) * 86400;
echo gmdate("Y-m-d", $unix_date);

//result is 2017-10-02

这对我有用...你能解释一下这是如何工作的吗? - Rowland Rose
2
@user4272288 不知道你是怎么做到的,但你救了我的一天,谢谢2017年的陌生人。 - Anton Levitsky

8
要检索日期,您需要将Excel时间戳转换为Linux时间戳。您需要知道的是:
  • Excel使用天数表示日期,而Linux使用秒数
  • Excel从1900年开始计数,而Linux从1970年开始计数。
  • 所有时间戳都在GM(格林威治标准时间),因此您不应该使用gmdate();进行转换,而应该只使用date();

因此,要从Excel转换为Linux,您需要:

  • 减去70年的天数:25569
  • 乘以一天的秒数:86400

这是代码:

function fromExcelToLinux($excel_time) {
    return ($excel_time-25569)*86400;
}

$linux_time = fromExcelToLinux(30637); 
echo date("Y-m-d",$linux_time);
//should print 1983-11-17

这就是全部内容。


0
我注意到你使用了PHPExcel库,在该库中有一个函数调用PHPExcel_Shared_Date::ExcelToPHP()来转换日期值。可以利用这个函数提取所需的结果。
include 'Classes/PHPExcel/IOFactory.php';

$inputFileName = 'index.xlsx';

// Read your Excel workbook
try {
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    $objPHPExcel = $objReader->load($inputFileName);
} catch (Exception $e) {
    die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME)
        . '": ' . $e->getMessage());
}

// Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();

// Loop through each row of the worksheet in turn
for ($row = 1; $row <= $highestRow; $row++) {
    // Read a row of data into an array
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);

    foreach ($rowData[0] as $k => $v) {
        if (PHPExcel_Shared_Date::isDateTime($sheet->getCellByColumnAndRow($k, $row))) {
            $dateValue = $sheet->getCellByColumnAndRow($k, $row)->getValue();
            $timestamp = PHPExcel_Shared_Date::ExcelToPHP($dateValue);
            $formattedDate = date('Y-m-d', $timestamp);
            echo "Row: " . $row . "- Col: " . ($k + 1) . " = " . $formattedDate . "<br />";
        } else {
            echo "Row: " . $row . "- Col: " . ($k + 1) . " = " . $v . "<br />";
        }
    }
}

我添加了一个检查,使用PHPExcel_Shared_Date::isDateTime()来确定单元格是否包含日期值。如果是,则使用$sheet->getCellByColumnAndRow($k, $row)->getValue()检索原始日期值。然后,我使用PHPExcel_Shared_Date::ExcelToPHP()将Excel日期值转换为PHP时间戳。最后,我使用date()将时间戳格式化为所需的格式。

这将以'Y-m-d'的格式输出日期。


0
如果您正在使用excel_reader进行Excel导入,您可以使用以下代码。
include('excel_reader/xlsxreader/simplexlsx.class.php');
$xlsx_class = new SimpleXLSX();
$j['IST_Time'] = '43010';
echo date('Y-m-d',$xlsx_class->unixstamp($j['IST_Time'])); // Result will be 2017-10-02

关于时间

$j['IST_Time'] = '0.416666666667'; 
echo date('h:i A',$xlsx_class->unixstamp($j['IST_Time'])); //10:00 AM

或查看simplexlsx.class.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接