PHPExcelを使用してExcelで日付形式を識別してフォーマットします



Identify Format Date Formats Excel Using Phpexcel



最近、システムでPHPExcelクラスライブラリを使用してインポート機能を実行し、アップロードされたExcelファイルを読み取り、フィールドマッピングを実行して、最後にExcelのデータをシステムにインポートしていました。その中で、日付形式の導入は私を有罪にしました。
まず、日付をインポートする方法。PHPExcelの日付形式は、日付文字列ではなく、取得時に数値を取得するため、インターネット上には、Excelで取得した数値を使用するUnix時間に変換するコードがたくさんあります。 PHPによる。そんなに面倒である必要はありません。 PHPExcelには次のようなメソッドがあります:[color = red] PHPExcel_Shared_Date :: ExcelToPHP($ value)[/ color]。直接使用できます。
ここで終わるとしたら、この記事は少し退屈すぎます。開発中は問題ありません。Excelセルが日付型[/ color]であるかを[color = red]で自動的に区別する方法です。いつものようにGoogleがありますが、この問題を解決する良い記事はありません。 PHPExcelのドキュメントとソースコードを調べて、その方法を見つけました。ついにメソッドを見つけました。あまり意味がありません。最初にコードを貼り付けました。

function Read_Excel_File2($file_name,&$result){
require_once 'include/PHPExcel/Classes/PHPExcel/IOFactory.php'
$result=null
$objReader = PHPExcel_IOFactory::createReader('Excel5')
// $objReader->setReadDataOnly(true)
try{
$objPHPExcel = $objReader->load($file_name)
}catch(Exception $e){}
If(!isset($objPHPExcel)) return 'Unable to parse the file'
$allobjWorksheets = $objPHPExcel->getAllSheets()
foreach($allobjWorksheets as $objWorksheet){
$sheetname=$objWorksheet->getTitle()
$highestRow = $objWorksheet->getHighestRow() // e.g. 10
$highestColumn = $objWorksheet->getHighestColumn()
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn)
for ($row = 1 $row <= $highestRow ++$row) {
for ($col = 0 $col <= $highestColumnIndex ++$col) {
$cell =$objWorksheet->getCellByColumnAndRow($col, $row)
$value=$cell->getValue()
if($cell->getDataType()==PHPExcel_Cell_DataType::TYPE_NUMERIC){
$cellstyleformat=$cell->getParent()->getStyle( $cell->getCoordinate() )->getNumberFormat()
$formatcode=$cellstyleformat->getFormatCode()
if (preg_match('/^([$[A-Z]*-[0-9A-F]*])*[hmsdy]/i', $formatcode)) {
$value=gmdate('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($value))
}else{
$value=PHPExcel_Style_NumberFormat::toFormattedString($value,$formatcode)
}
// echo $value,$formatcode,'
'

}
$result[$sheetname][$row-1][$col]=$value
}
}
}
return 0
}

その中で、日付判定に関する部分は主に以下の部分です。

$cell =$objWorksheet->getCellByColumnAndRow($col, $row)
$value=$cell->getValue()
if($cell->getDataType()==PHPExcel_Cell_DataType::TYPE_NUMERIC){
$cellstyleformat=$cell->getParent()->getStyle( $cell->getCoordinate() )->getNumberFormat()
$formatcode=$cellstyleformat->getFormatCode()
if (preg_match('/^([$[A-Z]*-[0-9A-F]*])*[hmsdy]/i', $formatcode)) {
$value=gmdate('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($value))
}else{
$value=PHPExcel_Style_NumberFormat::toFormattedString($value,$formatcode)
}
}


ちなみに私のPHPExcelのバージョンは1.7.2です:)