PHPExcel对于Excel中日期和时间类型的处理

简介: PHPExcel是一款优秀的处理Excel文件读写的开源PHP Library,能够给我们提供强大的Excel读写能力,本文针对Excel处理过程中关于日期和时间类型的处理进行深入的讨论。PHPExcel最新的版本是2014年3月2日发布的1.8.0版本,后来项目迁移到了GitHub,后续的版本已经更名为PHPSpreadSheet。
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="PHPExcelDate.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=PHPExcelCell::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();

     fvalue=cell->getFormattedValue();
     value=cell->getValue();
     pvalue=PHPExcelSharedDate::ExcelToPHP(value);

     echo "<tr><td>fvalue</td><td>value</td><td>formatcode</td><td>p_value</td></tr>";
}
echo "</table>";
 
返回的结果:

 

第一列是读取格式化之后的数据,可以看到部分格式没有能够正常显示,是因为PHPExcel预置的日期格式没有匹配到,导致按照数值进行显示。第二列是直接获取数值。第三列是格式化代码。最后一列是转化为PHP格式的时间。
 
三、使用PHPExcel写入格式化后的日期和时间数据
 
PHPExcel中提供了22种默认的日期格式,我们可以将日期进行格式化后写入,这样Excel打开的时候看到的就是格式化后的时间,运行以下代码(接上面的部分)。
 
objWriter=PHPExcelIOFactory::createWriter(objPHPExcel,'Excel2007');
worksheet>setTitle("DateTest");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 (phpexceldateformataskey => value)//$cell=$worksheet>getCellByColumnAndRow(2,$key+1);//$cell>setValue(time())>setFormatCode($value);$worksheet>setCellValue(C.($key+2),PHPExcelSharedDate::PHPToExcel(time()));$worksheet>getStyle(C.($key+2))>getNumberFormat()>setFormatCode($value);echotime()."".$value;objWriter->save($filename);
 
可以看看文件保存后的结果。

 

至此,我们基本上可以自如的处理Excel的日期字段的读取和写入了。
 

参考资料:

目录
打赏
0
0
0
0
6
分享
相关文章
Excel 如何利用Pivot Table将日期时间直接分类为月汇总
Excel 如何利用Pivot Table将日期时间直接分类为月汇总
Excel 如何利用Pivot Table将日期时间直接分类为月汇总
vue3读取配置文件变量+证书certbot+Excel身份证提取出生日期+crontab定时任务
vue3读取配置文件变量+证书certbot+Excel身份证提取出生日期+crontab定时任务
92 2
Python逐日填补Excel中的日期并用0值填充缺失日期的数据
Python逐日填补Excel中的日期并用0值填充缺失日期的数据
163 1
phpexcel(二)导入excel文件
有导出。自然就有导入。功能多样化嘛。 我这里使用的是laravel5.8框架(框架老点,但是这玩意完全就是一个自定义方法,跟框架版本什么的没有关系)
100 1
phpexcel(一)导出excel文件
先说一下header导出。 我这里使用的是thinkphp3.2框架.
97 0
算法竞赛100天第1天 —— 第十一届蓝桥杯省赛C/C++ B组 —— 跑步锻炼(不看会后悔的《日期年份问题三种解法 — C++和Java代码以及Excel解法》)
算法竞赛100天第1天 —— 第十一届蓝桥杯省赛C/C++ B组 —— 跑步锻炼(不看会后悔的《日期年份问题三种解法 — C++和Java代码以及Excel解法》)
368 0
算法竞赛100天第1天 —— 第十一届蓝桥杯省赛C/C++ B组 —— 跑步锻炼(不看会后悔的《日期年份问题三种解法 — C++和Java代码以及Excel解法》)
phpExcel:Excel数据导入导出最佳实战
PHP如何导入带图片的Excel表格呢?图片又如何导出到Excel中呢?导出的Excel如何定义样式使其更加漂亮?带着这些问题开始本文的分享。
490 0
phpExcel:Excel数据导入导出最佳实战
对比Excel,怎么用Python获取指定时间最后一天的日期
对比Excel,怎么用Python获取指定时间最后一天的日期
对比Excel,怎么用Python获取指定时间最后一天的日期
你有一份Excel日期函数大全,请注意查收(上)二
Excel中与日期有关的函数不少,今天给大家梳理一份日期函数大全,希望对你有帮助。
你有一份Excel日期函数大全,请注意查收(上)二
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问