PHPExcel對於Excel中日期和時間類型的處理

PHPExcel對於Excel中日期和時間類型的處理

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的日期字段的讀取和寫入了。
發佈了4 篇原創文章 · 獲贊 50 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章