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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

11338閲覧

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

ssmxgo

総合スコア178

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/07/25 05:32

編集2016/07/26 02:36

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

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

###該当のソースコード

php

1for ($i = 0; $i < $xlsObject->getSheetCount(); $i++) { 2 $xlsObject->setActiveSheetIndex($i); 3 $xlsSheet = $xlsObject->getActiveSheet(); 4 #-- シート名 5 $sheets[$i]['title'] = $xlsSheet->getTitle(); 6 7 $j = 0; 8 #-- シートの行ごとに読んでいく 9 foreach ($xlsSheet->getRowIterator() as $row) { 10 $xlsCell = $row->getCellIterator(); 11 $xlsCell->setIterateOnlyExistingCells(true); 12 13 $k = 0; 14 #-- 行のセルごとに読んでいく 15 foreach ($xlsCell as $cell) { 16 #-- 「シート名・行番号・セル番号」の連想配列にセル内のデータを格納 17 $sheets[$i]['sheet'][$j][$k] = $cell->getCalculatedValue(); 18 $k++; 19 } 20 $j++; 21 } 22}

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

###補足情報

php

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

PHP

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

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

投稿2016/07/26 03:24

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssmxgo

2016/07/26 04:36

ありがとうございます。 ほんと、説明が悪いのか申し訳ありません(汗) 現在、変換の手法はご提示の方法、また以下の方法でも可能であることは認知してます。せっかくご教授いただいたのに申し訳ありません。 今ぶつかっている内容は、Excelから抽出する時点で日付型のまま取り込む方法を探しています。読み込むExcelにより、何処の列が日付かわからないので変換する場所を特定できないという(汗) さらに、getVaule()ではなくgetFormatedValue()を利用してみたところ、うまくいくか!と期待させられましたが、不達のファイルの打ちExcel上ではどちらも YYYY/mm/dd で表示されるのに、getFormat...の結果、かたや YYYY/mm/dd 片や mm/dd/yy もう、ツボにはまりまくってます
guest

0

ベストアンサー

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

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

投稿2016/07/25 06:08

dupont_kedama

総合スコア925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssmxgo

2016/07/25 06:21

こちらで試してみましたが変換は…OKでした。 ありがとうございます。 ちょっと説明が悪かったかもしれませんが、`シリアル値を日付に戻すというプログラム自体は分かりそう`と書いたのは、取り込むファイルごとに日付の列が違うので、よみこみ時に日付型として読むことが前提条件になってしまいます。 ご提示いただいたコードを実行したところ、価格とかも日付になりました^^ 変換テストは成功しましたm(_ _)mありがとうございます
dupont_kedama

2016/07/26 05:33

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

2016/07/26 06:36

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

2016/07/26 06:57

改めて、こちらも確認したところ、 YYYY/mm/dd 0:00 と表現されたファイルも、 mm/dd/yy 0:00 もどちらも数値型でした。 調べてて驚いたのですが、そもそもセルの型には日付型というものが無いのかもしれません。あくまで表示用のフォーマットで整形していたということなのかもしれません。 http://apigen.juzna.cz/doc/ouardisoft/PHPExcel/class-PHPExcel_Cell_DataType.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問