2012-09-03 10 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; 
} 
問題は、私は、ユーザーがシステムにインポートされたファイルは、MacまたはWindows用のExcelを使用して充填したかどうかを検出しなければならないということです

ので、日付を正しく設定することができます(Macは1904カレンダーを使用し、Windowsは1900を使用します)。

PHPExcelを使用して検出する方法があるかどうかを知りたいと思います。そうでない場合、私は、ユーザーがラジオボタンでそれを知らせてみましょうことが、多分...

+0

これらの機能がPHPExcelに組み込まれている場合、独自の日付変換関数を作成する理由は何ですか? –

+1

私はreadonlydataをtrueに設定しているからです...ドキュメンテーションでは、「ワークブック(および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]; 
     } 
} 
関連する問題