Help us understand the problem. What is going on with this article?

Yii 1.1.x で PHPExcel ライブラリを使う

More than 3 years have passed since last update.

PHPExcel は、PHP で Excel のファイルを読み書きできる非常に便利なライブラリです。
もちろん、Yii-framework と一緒に使うことも出来ます。

ただし、PHPExcel のようにそれ自身がオートローダを持っているライブラリを Yii で使うときには、ちょっとした注意が必要です。

<?php

// Yii のオートローダを一旦登録解除する
spl_autoload_unregister(array('YiiBase', 'autoload'));

// PHPExcel のオートローダを登録する ... PHPExcel.php の中でやっている
$phpExcelPath = Yii::getPathOfAlias('ext.phpexcel');
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');

// Yii のオートローダを改めて登録する
spl_autoload_register(array('YiiBase', 'autoload'));

...

// Yii のオートローダが働く
$models = SomeModel::model()->findAll();

...

// PHPExcel のオートローダも働く
$objReader = PHPExcel_IOFactory::createReader('Excel5');

...

上記のようにすることで、Yii のオートローダと PHPExcel のオートローダの両方をお互いに干渉することなく動作させることが出来ます。PHPExcel のコードは一行もいじる必要はありません。

キモは、オートローダの登録の順序です。

Yii のオートローダは、ロードすべきファイルが見つからないと例外を投げます。と言うことは、後から登録された別のオートローダは、何もするチャンスを与えられない、という事になります。一方、PHPExcel のオートローダは、ファイルが見つからなかった場合には false を返して、後に続く別のオートローダに席を譲ります。

この点は、滅多にない Yii における設計の失敗、と言ってよいかもしれません。ともかく、順序を変えてやれば無問題、という次第です。

PHPExcel をラップした Yii のためのエクステンションも存在しますが、オートローダの処理を間違ってコケる事があるようです。素の PHPExcel をお奨めします。

あ、PHPExcel の解説だと思った人、ごめんなさい。

なお、また、上記は Yii 1.1.x のための記事です。 Yii 2.0 では、オートローダの問題は無くなりました。

softark
山の中の半農半プログラマ。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした