2012-09-03 57 views
5

我使用PHPExcel生成一個xls模板,用戶可以下載並用他想要的數據填充它。如我們所知,excel以數字格式保存日期。我使用這個功能,將數據轉換並返回時間戳:有沒有辦法檢測使用PHPExcel在windows或mac上是否生成了excel文件?

public static function excelToTimestamp($excelDateTime, $isMacExcel=false) { 
    $myExcelBaseDate = $isMacExcel ? 24107 : 25569; // 1st jan 1904 or 1st jan 1900 
    if (!$isMacExcel && $excelDateTime < 60) { 
     // Adjust for the spurious 29-Feb-1900 (Day 60) 
     --$myExcelBaseDate; 
    } 
    // Perform conversion 
    if ($excelDateTime >= 1) { 
     $timestampDays = $excelDateTime - $myExcelBaseDate; 
     $timestamp = round($timestampDays * 86400); 
     if (($timestamp <= PHP_INT_MAX) && ($timestamp >= -PHP_INT_MAX)) { 
      $timestamp = intval($timestamp); 
     } 
    } else { 
     $hours = round($excelDateTime * 24); 
     $mins = round($excelDateTime * 1440) - round($hours * 60); 
     $secs = round($excelDateTime * 86400) - round($hours * 3600) - round($mins * 60); 
     $timestamp = (integer) gmmktime($hours, $mins, $secs); 
    } 
    return $timestamp; 
} 

的問題是,我有檢測如果用戶導入到系統中的文件是使用Excel的Mac或Windows填補,所以我可以正確設置日期(mac使用1904日曆,而windows使用1900)。

我想知道是否有方法使用PHPExcel進行檢測。如果不是這樣,我可以讓用戶用一個單選按鈕通知,也許...

+0

出於興趣(在我回答之前),有什麼特別的原因可以說明,如果您已經在PHPExcel中創建了自己的日期轉換函數,那麼您爲什麼要編寫自己的日期轉換函數呢? –

+1

這是因爲我在文檔中將readonlydata設置爲true ......這就是說:「重要的是要注意Workbooks(和PHPExcel)將日期和時間存儲爲簡單的數值:它們只能通過以下方式與其他數值區分:應用於該單元格的格式掩碼當僅將讀取數據設置爲true時,PHPExcel不會讀取單元格格式掩碼,因此無法區分日期/時間和數字。它只支持gnumeric,對吧? – Periback

+0

其實..這對我來說不是強制性的(readonlydata)......可以用更簡單的方法來完成嗎? – Periback

回答

4

我只是用,作爲@markBaker建議的,PHPExcel函數的日期和時間轉換解決了這個問題,這樣做:

foreach ($rowLine as $header => $col) { 
     if ($header == self::COLUMN_DATE) { 
      //transform the excel date value into a datetime object 
      $date = PHPExcel_Shared_Date::ExcelToPHPObject($sheetData[$row][$col]); 
      $rowLine[$header] = $date->format('m/d/Y'); 
     }else if ($header == self::COLUMN_HOUR) { 
      //transform the excel time value into a datetime object 
      $time = PHPExcel_Shared_Date::ExcelToPHPObject($sheetData[$row][$col]); 
      $rowLine[$header] = $time->format('H:i'); 
     }else{ 
      $rowLine[$header] = $sheetData[$row][$col]; 
     } 
} 
相關問題