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

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

ただいまの
回答率

90.34%

PHP CakePHPとPHPExcelを用いて、アップロードされたエクセルファイルの内容をデータベースに保存する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,235

urdapple

score 74

CakePHP バージョン 2.8.4 
エクセルIOプラグイン PHPExcel 1.8.0(http://phpexcel.codeplex.com/releases/view/119187

クライアントからエクセルファイルをアップロードしてもらい、その内容をDBに保存するまでの流れを考えています。

根本的なところで申し訳ないのですが、探せど探せどCakePHPを用いて「サーバ側に置いてあるテンプレートにしたエクセルファイルを読み込んで必要情報を書込み、クライアントにダウンロードさせる」情報は多々あれど件名のような内容が見つからず困っております。

こちらとしてやりたいのはクライアントにエクセルファイルをアップロードしてもらい、サーバ側でPHPExcelを使って解析(配列化?PHP上で扱える形になれば何でもOKです)してDBに保存するって流れです。(マスタの全差し替え作業)
アップロードしてもらうファイル形式をCSVにしてもらえれば困らないんですが、クライアントからの依頼で「エクセルファイルを使う」はマストらしいので、仕方なくPHPExcelを導入しました。

そこで読み込みの段階ですでにいきなり躓いてしまっているんですが、ソースは以下の様な感じです。

View

echo $this->Form->create("Excel", ["url" => ["controller" => "AAA", "action" => "aaa_action"]]);?>
echo $this->form->input('excelfile', ["type" => "file"]);
echo $this->Form->end('アップロード');

Controller

public function aaa_action()
{
    if ($this->request->is('post'))
    {
        $objPHPExcel = PHPExcel_IOFactory::load([この部分]);
    }
}

上記コードの[この部分]としたところへ、何を指定してあげることで、PHPExcelのload関数によってファイルの中身が読み込めるのかが、さっぱりわかりません( ̄▽ ̄;)
ドキュメントも読んでみたのですが、そもそもが$_FILES[~]としてPHPデフォルトの変数を前提に話が進むので、CakePHPの場合、何を読みこめばいいのでしょう??

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

多分、

$this->request->data['Excel']['excelfile']['tmp_name']

にアップロードしたファイルが一時的に格納されてますから、それをPHPExcelで読めばいいですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/24 17:42 編集

    これもやってみたんですけれど、
    「Could not open for reading! File does not exist.」
    となってしまい、読み込めないんですよね?

    ちなみにコントローラーのaaa_actionアクション先頭で
    debug($this->request->data['Excel']);exit;
    として中身を確認するとnullなんです・・・

    ちなみにこうして、大元の中身を確認してみると
    debug($this->request->data);exit;

    以下のように連想配列が取れますが、
    array(
    'excelfile' => 'aaa.xlsx'
    )

    これってファイル名がストリングとして保存されているだけで、ファイル自体がテンポラリファイルの様な形で入っているわけではないんですよね(´・ω・)
    ファイルの中身ってCakePHPではどのように扱われているんでしょう??

    【追記】

    ちなみに
    $this->request->data['excelfile']を読み込ませてみたりもしたんですが
    「Could not open aaa.xlsx for reading! File does not exist.」
    でした_| ̄|○
    ファイル名は見えてるみたいなんですけど・・・

    キャンセル

  • 2016/05/24 17:45

    formのcreateの時に、
    'enctype' => 'multipart/form-data'
    が抜けてるからかな?

    キャンセル

  • 2016/05/24 17:59

    うわああああああああああ
    これでした!!!

    view側のcreate部分をこう書き換えて、
    echo $this->Form->create("PricesExcel", ["url" => ["controller" => "Prices", "action" => "add_file"], "enctype" => "multipart/form-data"]);
    言われたパラメータを足したら取得できました!

    ありがとうございますm(_ _)m
    ちなみに
    $this->request->data['Excel']['excelfile']['tmp_name']
    ではなく
    $this->request->data['excelfile']['tmp_name']
    とすることで読み込むことが出来ました!!

    ほんとーにありがとうございました!!

    キャンセル

  • 2016/05/24 18:01

    よかったです。

    キャンセル

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

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

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • PHP CakePHPとPHPExcelを用いて、アップロードされたエクセルファイルの内容をデータベースに保存する