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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

4837閲覧

cakephp3でPHPExcelを使ってexcelのリストをデータベースに挿入する

yajin

総合スコア75

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/12/27 10:18

編集2016/12/30 20:07

ネット上にはPHPExcelのファイルを出力というのもはあるのですが、データベースへ入力するというのが見つからず困っています。

挿入時に、データベースにある情報を一度空にして、再度Excelファイル(xlsx拡張子とxls拡張子)の情報を挿入したいと考えています。csvも考えましたが、データの中に,が出てくるためPHPEXCELを使うことにしました。

  • 行ったこと。
  1. composerでインストール

vendor\phpoffice\phpexcel\Classes\PHPExcel.php
vendor\phpoffice\phpexcel\Classes\PHPExcel
がパス。

  1. データベース情報

MySQL

1create table lists( 2id INT AUTO_INCREMENT primary key, 3item_id VARCHAR(255) NOT NULL, 4name VARCHAR(255) NOT NULL, 5description text NOT NULL, 6price INT NOT NULL, 7);
  1. controller

PHP

1<?php 2namespace App\Controller; 3use App\Controller\AppController; 4use PHPExcel; 5 6public function insert() 7 { 8 9 $list = $this->Lists->newEntity(); 10 if ($this->request->is('post')) { 11 $readfile = $this->request->data['excelfile']['tmp_name']; 12 $objPHPExcel = PHPExcel_IOFactory::load($readFile); 13 14 } 15 $this->set(compact('list')); 16 }
  1. view(insert.ctp)

PHP

1 <?php 2 echo $this->Form->create($lists, ['type' => 'file', 'class' => 'lists_form']); 3 echo $this->Form->input('excelfile', ['type' => 'file']); 4 echo $this->Form->button('登録', ['class' => 'submit']); 5 echo $this->Form->end(); 6 ?>
  1. model(ListsTable.php)

PHP

1 $validator 2 ->requirePresence('name', 'create') 3 ->notEmpty('name');//など

###問題となっていること。
PHPExcelが読み込めない。

をcontorollerやviewに書いても通らない。
Error: Class 'App\Controller\PHPExcel_IOFactory' not found

###追記
Error: Class 'App\Controller\PHPExcel_IOFactory' not found

完全修飾名を付けて対応。

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

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

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

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

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

guest

回答2

0

自己解決

とりあえずExcelデータを配列にするまでの処理。
バリテーションや挿入はまた後で。

PHP

1//controller 2<?php 3namespace App\Controller; 4use App\Controller\AppController; 5 6require_once(ROOT.DS.'vendor'.DS.'phpoffice'.DS.'phpexcel'.DS.'Classes'.DS.'PHPExcel.php'); 7require_once(ROOT.DS.'vendor'.DS.'phpoffice'.DS.'phpexcel'.DS.'Classes'.DS.'PHPExcel'.DS.'IOFactory.php'); 8 9use PHPExcel; 10use IOFactory; 11 12class HogesController extends AppController 13{ 14 public function add() 15 { 16 17 18 if ($this->request->is('post')) { 19 20 $filePath = $this->request->data['excelfile']['tmp_name']; 21 $reader = \PHPExcel_IOFactory::createReader('Excel2007');//xlsx形式の許可 xlsの場合Excel5 22 $book = $reader->load($filePath); 23 24 $book->setActiveSheetIndex(0);//一番最初のシートは0 二枚目は1 25 $sheet = $book->getActiveSheet();//選択シートへアクセスを開始する 26 27 $sheetData = array();//シートデータの配列用意 28 foreach ($sheet->getRowIterator() as $row) { 29 $tmp = array(); 30 foreach ($row->getCellIterator() as $cell) { 31 32 $tmp[] = $cell->getValue(); 33 } 34 $sheetData[] = $tmp; 35 } 36 debug($sheetData);//内容確認 37 38 } 39 $this->set(compact('hoge')); 40 } 41} 42 43

投稿2016/12/30 20:10

yajin

総合スコア75

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

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

0

PHPExcelでなさるのであれば、まずファイルをアップロードさせて、そのファイルをPHPExcelで読み込ませる必要があります。その部分のコードがゴッソリ欠落しています。
(通常のアップロードの処理なので、お調べになってください)

もしそうじゃなくて、サーバー上に置いてあるExcelファイルを読み込むのであれば、
$sheet->getCell('B2')->getValue()などとして、セルの値を取り、データベースに格納することになると思います。

流れとしては、
0. ファイルをアップロードするフォームと受け取るCakePHPのアクションを作る。
0. テンポラリファイルをPHPExcelで読み込む。
0. 必要なセルの範囲をループで読み込みつつ、データベースに挿入するデータを生成する。
0. 実際にデータを挿入する。

という感じではないでしょうか。

追記

すみません、エラーを見てませんでした。
namespaceが指定されているため、PHPExcel_IOFactoryクラスの参照がおかしくなっています。

php

1$this->reader = \PHPExcel_IOFactory::createReader('Excel2007'); 2```のように完全修飾名で書いたらどうでしょうか? 3[【cakephp3】PHPExcelが使えない](https://teratail.com/questions/35107)

投稿2016/12/29 10:50

編集2016/12/30 01:55
shi_ue

総合スコア4437

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

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

yajin

2016/12/29 13:21

$readFile = $this->request->data['excelfile']['tmp_name']; とかですよね? PHPExcelのIOFactory.phpの読み込み方がわからず困っております。
yajin

2016/12/30 02:29 編集

http://stackoverflow.com/questions/39098569/phpexcel-unable-to-read-file を参考にしてみました。 require_once(ROOT.DS.'vendor'.DS.'phpoffice'.DS.'phpexcel'.DS.'Classes'.DS.'PHPExcel.php'); require_once(ROOT.DS.'vendor'.DS.'phpoffice'.DS.'phpexcel'.DS.'Classes'.DS.'PHPExcel'.DS.'IOFactory.php'); use PHPExcel; use IOFactory; とし、 $inputFileType = \PHPExcel_IOFactory::identify($inputFileName); などとやれば参照できるなったようです。 一歩前進です。ちょっと細かいところを修正していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問