PHPExcel是一款优秀的处理Excel文件读写的开源PHP Library,能够给我们提供强大的Excel读写能力,本文针对Excel处理过程中关于日期和时间类型的处理进行深入的讨论。PHPExcel最新的版本是2014年3月2日发布的1.8.0版本,后来项目迁移到了GitHub,后续的版本已经更名为PHPSpreadSheet。
一、Excel中的日期和时间类型
Excel中的日期存储的是数值类型,计算的是从1900年1月1日到现在的数值。例如2008-12-31实际上存储的是39813。可以在Excel中验证,首先在一个单元格中输入2008-12-31,然后将单元格格式修改为“常规”,然后就会看到单元格内容变成了39813。
Excel中的时间是一个从0到0.99999999之间的小数值,表示从00:00:00(12:00:00 AM)到23:59:59(11:59:59 PM)之间的时间。例如12:00 PM的数值是0.5,表示一天的一半。
Excel 2007版本中提供了24种默认的日期类型格式,其中带星号的两个会和系统时区绑定(这样在不同时区的电脑之间传递文件时,时间会发生变化)其他的则不会根据时区发生变化。时间则提供了11种格式。
二、使用PHPExcel读取Excel中的日期和时间类型
我制作了一个模板Excel文件,按照中文日期类型输入了24个日期值,如下所示:
使用下面这段代码来读取数据,可以看到,在PHPExcel预置了格式的可以正常显示,否则会显示数值。注意如果打开了setReadDataOnly这个选项,则getFormattedValue函数将总是返回数值。
require_once '/libs/PHPExcel-1.8.0/Classes/PHPExcel.php';
require_once '/libs/PHPExcel-1.8.0/Classes/PHPExcel/IOFactory.php';
require_once '/libs/PHPExcel-1.8.0/Classes/PHPExcel/Shared/Date.php';

$filename = "PHPExcel_Date.xlsx";
$objReader = PHPExcel_IOFactory::createReaderForFile($filename);
//$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($filename);
$data['sheetsinfo'] = $objReader->listWorksheetInfo($filename);
$objWriter = '';

$objPHPExcel->setActiveSheetIndex(0);
$worksheet = $objPHPExcel->getActiveSheet();
$columnCount = PHPExcel_Cell::columnIndexFromString( $worksheet->getHighestColumn() );
$rowCount = $worksheet->getHighestRow();

echo "<table>";
for($row = 1; $row <= $rowCount; $row++){
     $cell = $worksheet->getCellByColumnAndRow(0, $row);
     $cellstyleformat = $worksheet->getStyle($cell->getCoordinate())->getNumberFormat();
     $formatcode = $cellstyleformat->getFormatCode();

$f_value = $cell->getFormattedValue();
     $value = $cell->getValue();
     $p_value = PHPExcel_Shared_Date::ExcelToPHP($value);

echo "<tr><td>$f_value</td><td>$value</td><td>$formatcode</td><td>$p_value</td></tr>";
}
echo "</table>";

返回的结果:
第一列是读取格式化之后的数据,可以看到部分格式没有能够正常显示,是因为PHPExcel预置的日期格式没有匹配到,导致按照数值进行显示。第二列是直接获取数值。第三列是格式化代码。最后一列是转化为PHP格式的时间。
三、使用PHPExcel写入格式化后的日期和时间数据
PHPExcel中提供了22种默认的日期格式,我们可以将日期进行格式化后写入,这样Excel打开的时候看到的就是格式化后的时间,运行以下代码(接上面的部分)。
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');
$worksheet->setTitle("Date Test");
$phpexcel_date_format = array(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2, PHPExcel_Style_NumberFormat::FORMAT_DATE_DDMMYYYY, PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH, PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYMINUS, PHPExcel_Style_NumberFormat::FORMAT_DATE_DMMINUS, PHPExcel_Style_NumberFormat::FORMAT_DATE_MYMINUS, PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME1, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME2, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME5, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME6, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME7, PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME8, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH, PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX14, PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15, PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX16, PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX17, PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX22);

foreach ($phpexcel_date_format as $key => $value) {
     //$cell = $worksheet->getCellByColumnAndRow(2, $key + 1);
     //$cell->setValue(time())->setFormatCode($value);
     $worksheet->setCellValue('C'.($key+2), PHPExcel_Shared_Date::PHPToExcel(time()));
     $worksheet->getStyle('C'.($key+2))->getNumberFormat()->setFormatCode($value);
     echo time() . "-" . $value;
}

$objWriter->save($filename);

可以看看文件保存后的结果。
至此,我们基本上可以自如的处理Excel的日期字段的读取和写入了。

参考资料:

1、https://github.com/PHPOffice/PHPExcel
2、Codeplex PHPExcel
3、Github PHPSpreadsheet
4、http://stackoverflow.com/questions/16708471/phpexcel-getcalculatedvalue-returns-value
5、http://phpexcel.codeplex.com/discussions/371418
6、http://stackoverflow.com/questions/17601417/phpexcel-date-being-parsed-incorrectly

PHPExcel对于Excel中日期和时间类型的处理相关推荐

  1. SQL中日期与时间类型及函数

    一.日期与时间类型 数据类型 含义 对应范围 DATETIME 日期和时间 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 DATE 日期 1000-01-01~ ...

  2. MySQL中日期和时间类型

    https://www.cnblogs.com/wlzjdm/p/6953398.html 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 1.1 Da ...

  3. MySQL中的日期和时间类型

    文章目录 1 MySQL中的日期和时间类型 1 MySQL中的日期和时间类型 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型.其中,YEAR类型表示年, ...

  4. Mysql中的日期与时间类型

    MySQL有多种表示日期和时间的数据类型,不同的版本可能有所差异,MySQL8.0版本支持的日期和时间类型主要有:YEAR类型.TIME类型.DATE类型.DATETIME类型和TIMESTAMP类型 ...

  5. mysql日期和时间类型_MySQL日期和时间类型

    MySQL中存储日和和时间,使用日期和时间类型. 提供的包括YEAR.DATE.TIME.DATETIME和TIMESTAMP. YEAR 占用:1字节 取值范围:1901~2155 日期格式:YYY ...

  6. MySQL DTAETIME、TIMESTAMP、DATE、TIME、YEAR(日期和时间类型)

    MySQL 中有多处表示日期的数据类型:YEAR.TIME.DATE.DTAETIME.TIMESTAMP.当只记录年信息的时候,可以只使用 YEAR 类型. 每一个类型都有合法的取值范围,当指定确定 ...

  7. 4、(日期和时间类型)DTAETIME、TIMESTAMP、DATE、TIME、YEAR

    MySQL 中有多处表示日期的数据类型:YEAR.TIME.DATE.DTAETIME.TIMESTAMP. 当只记录年信息的时候,可以只使用 YEAR 类型. 每一个类型都有合法的取值范围,当指定确 ...

  8. MySQL日期和时间类型

    MySQL中存储日和和时间,使用日期和时间类型. 提供的包括YEAR.DATE.TIME.DATETIME和TIMESTAMP. YEAR 占用:1字节 取值范围:1901~2155 日期格式:YYY ...

  9. mysql中不要 秒的函数_Mysql中日期和时间函数应用不用求人 | 很文博客

    对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型. 这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: my ...

最新文章

  1. hadoop学习-Netflix电影推荐系统
  2. arthas jvm相关命令使用示例:sysenv、getstatic、vmoption、ognl
  3. layui弹框提示层:倒计时(layui-font-red颜色定义)
  4. 查看 Proxy 的 $ProxyX.class文件
  5. java健康检查的作用,spring cloud分布式健康检查
  6. informix的常用SQL语句
  7. Sublime Text3运行node.js
  8. html获取边缘元素,JQuery 获取元素到浏览器可视窗口边缘的距离
  9. 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论...
  10. Python判断字符串是否为数字(数字、小数、负数、负小数、0)
  11. app icon在线生成
  12. 【存储】SDS软件定义存储,看这一篇就够了
  13. qt项目转Xcode项目(Xcode开发qt)
  14. 前端vue方法导出为xsml
  15. 支付宝H5,微信H5,微信公众号支付回调
  16. 使用Matlab把图片集合生成视频流文件
  17. python怎么编程乘法口诀表_少儿编程|python|制作九九乘法口诀表
  18. 这件物品不能添加到您的库中,因为他在你所在的地区不可用
  19. 华科计算机组成原理运算器ALU实验(LogisimEducoder)
  20. 江苏2021年计算机二级报名时间,江苏3月计算机二级考试报名时间安排

热门文章

  1. 基于jquery多种切换效果的焦点图(兼容ie6)
  2. 从零开始学建站-主机篇
  3. STM32f1的中断系统
  4. windows phone发布时其他注意事项
  5. 传输控制协议(TCP)基础知识概述
  6. JSON反序列的问题原因查找
  7. 自助收银导致货损增加,阿里安全如何用视频识别AI应对?
  8. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶
  9. nginx配置websocket代理
  10. 月薪3万的程序员都避开了哪些坑