質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

PHPExcelにて、日付がシリアル値で取得されてしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,218

ssmxgo

score 164

PHPExcelにて、日付がシリアル値で取得されてしまう

とあるサイトのコードを参考に(参考元)作ってみましたが、日付型がシリアル値になってしまいます。
このシリアル値を日付に戻すというプログラム自体は分かりそうなのですが、読み込み時に日付型で取得したいです。

なぜシリアル値で取得されてしまい、どのようにすれば日付型で取得できるのか

該当のソースコード

for ($i = 0; $i < $xlsObject->getSheetCount(); $i++) {
  $xlsObject->setActiveSheetIndex($i);
  $xlsSheet = $xlsObject->getActiveSheet();
  #-- シート名
  $sheets[$i]['title'] = $xlsSheet->getTitle();

  $j = 0;
  #-- シートの行ごとに読んでいく
  foreach ($xlsSheet->getRowIterator() as $row) {
    $xlsCell = $row->getCellIterator();
    $xlsCell->setIterateOnlyExistingCells(true);

    $k = 0;
    #-- 行のセルごとに読んでいく
    foreach ($xlsCell as $cell) {
      #-- 「シート名・行番号・セル番号」の連想配列にセル内のデータを格納 
      $sheets[$i]['sheet'][$j][$k] = $cell->getCalculatedValue();
      $k++;
    }
    $j++;
  }
}

試したこと

よくわからずにですね…getCalculatedValueをgetVauleに変更したりしましたけど関係なさそうです。

補足情報

$xlsObject->getActiveSheet()->toArray(null,true,true,true);


では日付型で取得できますが、空白セルなど冗長になるのでこの手段は今のところ検討していません

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

日付型ではなく文字列型での取得になりますが、->getFormattedValue() が使えるかもしれません。

参考 http://elearn.jp/phpexcel/cell/getformattedvalue.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/25 15:21

    こちらで試してみましたが変換は…OKでした。
    ありがとうございます。

    ちょっと説明が悪かったかもしれませんが、`シリアル値を日付に戻すというプログラム自体は分かりそう`と書いたのは、取り込むファイルごとに日付の列が違うので、よみこみ時に日付型として読むことが前提条件になってしまいます。

    ご提示いただいたコードを実行したところ、価格とかも日付になりました^^
    変換テストは成功しましたm(_ _)mありがとうございます

    キャンセル

  • 2016/07/26 14:33

    getDataType() でCELLのデータ型が取れるように書いてあるので、これで日付型/それ以外の区別がつけばと思ったのですが、手元の環境では日付セルは数値型として判別されました。
    つまりExcelは値としては数値型と日付型を区別しておらず、書式で区別しているということのようです。
    よって getFormatedValue() で取得した文字列を正規表現(可能性のある書式をすべて入れて)でチェックして日付かどうか判別するしかないのかもしれません。

    キャンセル

  • 2016/07/26 15:36

    書式ですか…ひえぇ〜、そーんなロジックだったとは(汗)
    なんかExcel上では同じく表記されているのにgetFormatedValueで取得すると YYYY/mm/dd 0:00 でとれたり、ファイルによっては mm/dd/yy 0:00 で取れたり。
    うまく正規表現考えないといけませんねぇ。
    とても勉強になりましたし、

    キャンセル

  • 2016/07/26 15:57

    改めて、こちらも確認したところ、 YYYY/mm/dd 0:00 と表現されたファイルも、 mm/dd/yy 0:00 もどちらも数値型でした。

    調べてて驚いたのですが、そもそもセルの型には日付型というものが無いのかもしれません。あくまで表示用のフォーマットで整形していたということなのかもしれません。
    http://apigen.juzna.cz/doc/ouardisoft/PHPExcel/class-PHPExcel_Cell_DataType.html

    キャンセル

0

UNIXTIMEをMSTIMEに変換するときよくこんな風にします

function unixtime2ms($timevalue) {
return (round($timevalue / 60  / 60 +9) / 24 + 25569);
}

これに対して文字列から変化するなら
unixtime2ms(strtotime('2016-07-26'));
のようにUNIXTIMEに変換して渡します

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/26 13:36

    ありがとうございます。
    ほんと、説明が悪いのか申し訳ありません(汗)
    現在、変換の手法はご提示の方法、また以下の方法でも可能であることは認知してます。せっかくご教授いただいたのに申し訳ありません。

    今ぶつかっている内容は、Excelから抽出する時点で日付型のまま取り込む方法を探しています。読み込むExcelにより、何処の列が日付かわからないので変換する場所を特定できないという(汗)

    さらに、getVaule()ではなくgetFormatedValue()を利用してみたところ、うまくいくか!と期待させられましたが、不達のファイルの打ちExcel上ではどちらも
    YYYY/mm/dd
    で表示されるのに、getFormat...の結果、かたや
    YYYY/mm/dd
    片や
    mm/dd/yy

    もう、ツボにはまりまくってます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる