iT邦幫忙

0

[php,phpExcel]phpExcel讀取日期異常(已解決)

我想透過phpExcel讀取使用者上傳的excel資料並存到資料庫中,但在讀取到日期欄位是出現異常~~

我的測試Excel欄位的日期是 2019/09/08,格式是預設日期

透過PHPExcel_Shared_Date::ExcelToPHP讀取結果是 2036-02-15 @@
就算時差問題應該不會到17年吧,那我輸出成字串再後續處理~

參考這篇在PHP EXCEL中读取日期格式
透過PHPExcel_Style_NumberFormat :: toFormattedString(XXX,PHPExcel_Style_NumberFormat :: FORMAT_DATE_YYYYMMDD2)
讀取結果是 9/8/2019 ...格式不對呀,依照這篇格式應該要 2019-09-08才對吧??

想請問各位前輩們要如何讀出日期(yyyy-mm-dd)??


$PHPExcel = PHPExcel_IOFactory::load(current($_FILES)['tmp_name']);
$rows = $PHPExcel->getActiveSheet()->toArray(null, true, true, true);
foreach ($rows as $index => $row) {

//日期欄位是$row['B']

//方法一: 結果是 2036-02-15
//date('Y-m-d',PHPExcel_Shared_Date::ExcelToPHP($row['B']))

//方法二: 結果是 9/8/2019
//PHPExcel_Style_NumberFormat :: toFormattedString($row['B'],PHPExcel_Style_NumberFormat :: FORMAT_DATE_YYYYMMDD2)

// 請問前輩們若想取得 2019-09-08 要如何處理??

// -----

//" date():9/8/2019"
$tmp1 =  ' date():'.$row['B']; 

// " date():1970-01-01"
$tmp2 =  ' date():'.date('Y-m-d',$row['B']);

// " date():-2208297600"
$tmp3 =  ' date():'.PHPExcel_Shared_Date::ExcelToPHP($row['B']); 

// " date():2036-02-15"
$tmp4 =  ' date():'.date('Y-m-d',PHPExcel_Shared_Date::ExcelToPHP($row['B']));

//" date():9/8/2019"
$tmp5 =  ' date():'.PHPExcel_Style_NumberFormat :: toFormattedString($row['B'],PHPExcel_Style_NumberFormat :: FORMAT_DATE_XLSX14 );

//" date():9/8/2019"
$tmp6 =  ' date():'.PHPExcel_Style_NumberFormat :: toFormattedString($row['B'],PHPExcel_Style_NumberFormat :: FORMAT_DATE_YYYYMMDD2);

}

後來自己解決了~~~

解決方是是修改這行

$rows = $PHPExcel->getActiveSheet()->toArray(null, true, true, true);

第三個參數指的是資料要不要格式化,當然不要,所以改成false即可
剩下的用方法一就ok了

柯柯 iT邦新手 5 級 ‧ 2019-10-09 15:42:07 檢舉
echo 'SQL:'.$row['B'].' date():'.date('Y-m-d',$row['B']); 這樣出來的有沒有一樣?
舜~ iT邦研究生 3 級 ‧ 2019-10-09 16:19:53 檢舉
excel檔案的欄位格式有錯,我再嘗試一下

1 個回答

0
dragonH
iT邦大師 3 級 ‧ 2019-10-09 15:59:36

你說的 phpExcel

是指這個/images/emoticon/emoticon16.gif

我是照他說的改用 PhpSpreadsheet

也可以順利的拿到日期

<?php
  require 'vendor/autoload.php';
  $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  $reader->setReadDataOnly(true);
  $spreadsheet = $reader->load("demo.xlsx");
  $date = $spreadsheet->getActiveSheet()->getCell('A1')->getValue();
  $dateFormat = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($date);
  print_r($dateFormat);

result

DateTime Object
(
    [date] => 2019-10-09 00:00:00.000000
    [timezone_type] => 3
    [timezone] => UTC
)

他也有轉 timestamp 等...

很多 function 可以用


剛剛有 phpWord

現在有 phpExcel

你們是講好的嗎XD /images/emoticon/emoticon37.gif

我要發表回答

立即登入回答