2012-09-03 20 views
5

Kullanıcının istediği veriyi indirip doldurabileceği bir xls şablonu oluşturmak için PHPExcel kullanıyorum. Bilindiği gibi, excel tarihi bir formatta kaydeder. Ben verileri dönüştürmek ve zaman damgası dönmek için bu işlevi kullanıyorum:Windows veya PHPExcel kullanan bir excel dosyası oluşturuldu mu algılamanın bir yolu var mı?

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; 
} 
Sorun kullanıcı sisteme ithal dosya mac veya pencereler için excel kullanılarak doldurulmuş olup olmadığını tespit etmek zorunda olduğunu

, bu yüzden tarihi doğru şekilde ayarlayabildiğim (Mac, 1900'ü kullanırken, 1904 takvim kullanır).

PHPExcel kullanarak bunu algılamanın bir yolu olup olmadığını bilmek istiyorum. Değilse, ben bunu

+0

Çıktı (önceden cevap vermeden önce), PHPExcel'de zaten yerleşik olduğunda kendi tarih dönüştürme işlevlerinizi yazmanın belirli bir nedeni var mı? –

+1

çünkü readonlydata'yı belgede doğru olarak ayarladım: “Çalışma Kitaplarının (ve PHPExcel) tarih ve saatleri basit sayısal değerler olarak sakladığını unutmamak önemlidir: bunlar yalnızca diğer sayısal değerlerden ayırt edilebilirler. Bu hücreye uygulanan format maskesi.Parça verileri sadece true olarak ayarlandığında, PHPExcel hücre formatı maskelerini okumaz, bu yüzden tarihler/zamanlar ve sayılar arasında ayrım yapmak mümkün değildir. " ve sadece gnumerik için destekleniyor, değil mi? – Periback

+0

aslında .. Bu yöntemi kullanmak benim için zorunlu değil (readonlydata) ... Daha basit bir şekilde yapılabilir mi? – Periback

cevap

4

Sadece @markBaker önerildiği gibi tarih ve saati dönüştürmek için, PHPExcel işlevini kullanarak bu sorunu çözmüş ... kullanıcı belki bir radiobutton ile bilgilendirir izin verebilir:

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]; 
     } 
} 
İlgili konular