前提・実現したいこと
LaravelでExcelを読み込みデータベースにインサートするバッチを作成しています。
Excelを読み込みライブラリとしてPhpspreadsheetを使用しています。
問題が一つありまして、文字の入った数字に対応しないようになっていて変な数字に変換されてしまいます。
今回は
といった生年月日の情報をDateに変換したいのですが、エクセルの一つのカラムに
|生年月日|
|2000/03/22|
がある場合、
echo $sheet->getCell($key . $row_number)->getValue();
を実行したところ
40231%
に変換されてしまいます。
先頭に/を追加して
|生年月日|
|/2000/03/22|
にすると
/2000/03/22
正しく出力されます。おそらく、先頭文字で数字か文字かを判断していて後者では文字列として認識されるのだと思います。
また、'2000/03/22'のようにシングルコーテーションでくくっても結果は変わらずでした。
聞きたいこと
聞きたいことは三つあります
- 前者の形式のまま文字列として認識させる方法はあるのか
- 変換されてしまった数字から文字列に変換させることはできるのか
- 両方無理な場合、phpでエクセルを操作する別の方法は存在するのか
以上の三つになります。
何か心当たりのあるかたは教えていただけると幸いです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
該当コード
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $spreadsheet = $reader->load('./storage/app/tmp.xlsx'); //シート読み込み $sheet = $spreadsheet->getSheetByName("会員コード"); // 行でループ $key_array = array(); foreach ($sheet->getRowIterator() as $row) { // カラム名 => 列番号 の連想配列作成 if ($row->getRowIndex() < 2) { //1行目にカラム名として連想配列のキーが入っている foreach($row->getCellIterator() as $key => $cell){ $key_array[$cell->getValue()] = $key; } continue; } $row_number = $row->getRowIndex(); // データ取得 $data = array(); // $data['code'] = $this->get_value($sheet, $key_array['会員コード'], $row_number); $data['birthday'] = $this->get_value($sheet, $key_array['生年月日'], $row_number);
試したこと
- を入れると文字列として認識される
- エクセルのDataTypeを変更しても治らない
補足情報(FW/ツールのバージョンなど)
"phpoffice/phpspreadsheet": "^1.6"