从上传的 Excel 文件中读取日期
Reading date from uploaded Excel file
我正在通过 PHP Excel 上传一个 Excel 文件。 C 列的日期格式为 mm/dd/yyy。
当我回显日期(例如“10/3/2016”)时,它读取为 42646。为该列设置的格式是短日期。
如何将它读作正常日期而不是 42646。
这是模型
function fi_upload($file_name){
$file = './uploads/'.$file_name;
$this->load->library('excel');
$objPHPExcel = PHPExcel_IOFactory::load($file);
$cell_collection = $objPHPExcel->getActiveSheet()->getCellCollection();
foreach ($cell_collection as $cell) {
$column = $objPHPExcel->getActiveSheet()->getCell($cell)->getColumn();
$row = $objPHPExcel->getActiveSheet()->getCell($cell)->getRow();
$data_value = $objPHPExcel->getActiveSheet()->getCell($cell)->getValue();
if ($row == 1) {
$header[$row][$column] = $data_value;
} else {
$arr_data[$row][$column] = $data_value;
}
}
$data['header'] = $header;
$data['values'] = $arr_data;
$datecell = $objPHPExcel->getActiveSheet()->getCell('P2');
if(PHPExcel_Shared_Date::isDateTime($datecell)) {
$InvDate = date($format="Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($datecell));
}
echo $InvDate;
exit();
foreach ($arr_data as $q){
echo $q['C']; // column of date, date is echoed as 42646
exit(); //here i exit to display the date
}
稍后我还必须以 yyyy/mm/dd 格式将其插入数据库(如果读取正确,我可以这样做)
谢谢。
更新:
显然这是 Excel 文件问题,而不是 php。通过 TEXT() 转换单元格值是 @Hallur 建议的解决方案。
更新 2.0:
我正在尝试通过 PHPEXCEL 方法进行操作,但出现以下两个问题。
- : class PHPExcel_Cell 的对象无法转换为 int
- 回显日期为 2036-02-07,其中单元格中的日期为 10/4/2016
这个问题的答案在这里:
Excel weird behaviour with dates => text
数字 42646,是自 1900 年 1 月 1 日以来的天数。
要将 excel 基准日期转换为 unix 时间 (time()
),您必须计算 unix 开始与 excel 基准时间开始之间的差异。 (unix 开始: d-m-Y H:i:s
-> 01-01-1970 01:00:00
) (excel 开始: d-m-Y
-> 1-1-1900
)
首先求出差值,大约是 70 年零 1 小时(+ 1 天,因为 excel 日期 1-1-1900
= 1,而不是 0。)
70年1天1小时=70年+25小时。 (为了弥补闰年,我们不得不说 365.25 而不是一年 365 天)
(70*365.25*24*60*60)+(25*60*60)
现在,我们还需要将 excel 日期值转换为秒:42646*24*60*60
(~ 116 年)
我们需要将它们相互减去以获得 unix 时间,并且由于 excel 日期高于 70 年,我们将其放在第一位。
回显当天:
echo date("d-m-Y", (42646*24*60*60) - ((70*365.25*24*60*60)+(25*60*60)));
编辑:我刚刚意识到额外的一小时是因为我的时区.. CET,而不是 UTC。
42646
是一个 MS Excel 序列化时间戳值,自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,取决于电子表格是否使用 Windows 或Mac日历)
PHPExcel 提供了多种函数在 MS Excel 序列化时间戳和 Unix 时间戳或 PHP DateTime 对象之间转换值(反之亦然),所有其中可以在 PHPExcel_Shared_Date
class 中找到,例如
ExcelToPHP()
将 MS Excel 序列化时间戳转换为 unix 时间戳
ExcelToPHPObject()
将 MS Excel 序列化时间戳转换为 PHP DateTime 对象
或者,使用 getFormattedValue()
方法而不是 getValue()
将 return 一个格式化的 date/time 字符串值而不是序列化的 tiemstamp
$field1= $objWorksheet->getCellByColumnAndRow(0,$i)->getFormattedValue(); //Excel Column 3
$date = PHPExcel_Shared_Date::ExcelToPHP($field1); //unix
echo $field1= gmdate("Y-m-d", $date); //date
我正在通过 PHP Excel 上传一个 Excel 文件。 C 列的日期格式为 mm/dd/yyy。
当我回显日期(例如“10/3/2016”)时,它读取为 42646。为该列设置的格式是短日期。
如何将它读作正常日期而不是 42646。
这是模型
function fi_upload($file_name){
$file = './uploads/'.$file_name;
$this->load->library('excel');
$objPHPExcel = PHPExcel_IOFactory::load($file);
$cell_collection = $objPHPExcel->getActiveSheet()->getCellCollection();
foreach ($cell_collection as $cell) {
$column = $objPHPExcel->getActiveSheet()->getCell($cell)->getColumn();
$row = $objPHPExcel->getActiveSheet()->getCell($cell)->getRow();
$data_value = $objPHPExcel->getActiveSheet()->getCell($cell)->getValue();
if ($row == 1) {
$header[$row][$column] = $data_value;
} else {
$arr_data[$row][$column] = $data_value;
}
}
$data['header'] = $header;
$data['values'] = $arr_data;
$datecell = $objPHPExcel->getActiveSheet()->getCell('P2');
if(PHPExcel_Shared_Date::isDateTime($datecell)) {
$InvDate = date($format="Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($datecell));
}
echo $InvDate;
exit();
foreach ($arr_data as $q){
echo $q['C']; // column of date, date is echoed as 42646
exit(); //here i exit to display the date
}
稍后我还必须以 yyyy/mm/dd 格式将其插入数据库(如果读取正确,我可以这样做)
谢谢。
更新:
显然这是 Excel 文件问题,而不是 php。通过 TEXT() 转换单元格值是 @Hallur 建议的解决方案。
更新 2.0: 我正在尝试通过 PHPEXCEL 方法进行操作,但出现以下两个问题。
- : class PHPExcel_Cell 的对象无法转换为 int
- 回显日期为 2036-02-07,其中单元格中的日期为 10/4/2016
这个问题的答案在这里:
Excel weird behaviour with dates => text
数字 42646,是自 1900 年 1 月 1 日以来的天数。
要将 excel 基准日期转换为 unix 时间 (time()
),您必须计算 unix 开始与 excel 基准时间开始之间的差异。 (unix 开始: d-m-Y H:i:s
-> 01-01-1970 01:00:00
) (excel 开始: d-m-Y
-> 1-1-1900
)
首先求出差值,大约是 70 年零 1 小时(+ 1 天,因为 excel 日期 1-1-1900
= 1,而不是 0。)
70年1天1小时=70年+25小时。 (为了弥补闰年,我们不得不说 365.25 而不是一年 365 天)
(70*365.25*24*60*60)+(25*60*60)
现在,我们还需要将 excel 日期值转换为秒:42646*24*60*60
(~ 116 年)
我们需要将它们相互减去以获得 unix 时间,并且由于 excel 日期高于 70 年,我们将其放在第一位。
回显当天:
echo date("d-m-Y", (42646*24*60*60) - ((70*365.25*24*60*60)+(25*60*60)));
编辑:我刚刚意识到额外的一小时是因为我的时区.. CET,而不是 UTC。
42646
是一个 MS Excel 序列化时间戳值,自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,取决于电子表格是否使用 Windows 或Mac日历)
PHPExcel 提供了多种函数在 MS Excel 序列化时间戳和 Unix 时间戳或 PHP DateTime 对象之间转换值(反之亦然),所有其中可以在 PHPExcel_Shared_Date
class 中找到,例如
ExcelToPHP()
将 MS Excel 序列化时间戳转换为 unix 时间戳ExcelToPHPObject()
将 MS Excel 序列化时间戳转换为 PHP DateTime 对象
或者,使用 getFormattedValue()
方法而不是 getValue()
将 return 一个格式化的 date/time 字符串值而不是序列化的 tiemstamp
$field1= $objWorksheet->getCellByColumnAndRow(0,$i)->getFormattedValue(); //Excel Column 3
$date = PHPExcel_Shared_Date::ExcelToPHP($field1); //unix
echo $field1= gmdate("Y-m-d", $date); //date