PHP

PHPExcelでWarning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2″エラーが出たときの対処法

PHP-アイキャッチ

こんにちは!ゆーたろうです。

物販をやっていると売上管理や在庫管理などでよく使うのがExcelですよね。

スプレッドシートでの共有の方法もありますが、やはりまだまだ外注さんとのやり取りや、仕入れ先・卸先とのやり取りでも、エクセルの出番は健在です。

しかし、やり取りで使ったこのExce。自分でスプレッドシートやデータベースを運用している身としては、やはりそられへの登録手間がかかるのがネックです。

仕入先・外注さん⇔Exce⇔自分のデータベースやスプレッドシートに手入力

こういう構図になっているので何とかしたいものです。

そこで調べたら、PHPExcelというライブラリがあることを発見!!

早速使ったところタイトルの通りエラーが出たので、その対処を紹介していきます。

PHPExcelライブラリを使ったらエラーが出た

まず、PHPExcelの使い方ですが、下記サイトが参考になりました。

そして、以下のようなExceを作成し、読み込ませてみました。

<?php

// PHPExcelライブラリ読み込み
require_once 'Classes/PHPExcel.php';
require_once 'Classes/PHPExcel/IOFactory.php';
 ini_set( 'display_errors', 1 );

// 読み込むExcelファイル
$input = 'read_test.xlsx';

// ファイル拡張子
$extension = pathinfo($input, PATHINFO_EXTENSION);

// ファイルを開く
// xlsファイルのとき
if ($extension === 'xls')
{
  $obj = PHPExcel_IOFactory::createReader('Excel5');
}
// xlsxファイルのとき
else if ($extension === 'xlsx')
{
  $obj = PHPExcel_IOFactory::createReader('Excel2007');
}else{
	echo "不明な拡張し:".$extension;
	return ;
	}

$file = $obj->load($input);

foreach ($file->getSheetNames() as $i => $sheet_name) {
  // シート名を表示
  echo mb_convert_encoding($sheet_name, "SJIS", "UTF-8") . "<BR>";

  // セルの値を表示
  $file->setActiveSheetIndex(0);
  $sheet = $file->getActiveSheet();
  foreach ($sheet->getRowIterator() as $row) {
    foreach ($row->getCellIterator() as $cell) {
      echo mb_convert_encoding($cell->getCalculatedValue(), "SJIS", "UTF-8") . " ";
    }
    echo "<BR>";
  }
  echo "<BR>";
}

read_test.xlsxの内容

PHPExcelへ読み込ませるExceファイル

実行結果

PHPExcelでWarning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2” XXXXXXXXXXX/Classes/PHPExcel/Shared/OLE.php line 288
Sheet1
test
テスト
A列 B列 C列

すると、上記のようなエラーが発生しました。

エラーの意味

まず、出たエラーはこちらです。

PHPExcelでWarning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2” XXXXXXXXXXX/Classes/PHPExcel/Shared/OLE.php line 288

このエラーは私は初めて見たものなので、「Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2″」を検索ワードにして調べてみました。

PHP7.3からbreakの代わりにcontinueを使うとWarningになる。

上記記事から「switchの抜ける文として、continueは使えない。breakかcontinue 2を使うこと」というエラーであることが分かりました。

私としては、switch文にはbreakしか使わないと思っていましたが、代わりにcontinueを使っても同じ処理ができるのですね。それ自体初知りでした。

エラーが発生したプログラム

さて、今回発生したエラー個所は、「Classes/PHPExcel/Shared/OLE.php line 288」となっていますね。

つまり、私が導入したPHPExcelライブラリから出ていることが分かりました。

なので早速当該個所を見てみます。

警告文発生の当該箇所
        for ($pos = 0;; $pos += 128) {
            fseek($fh, $pos, SEEK_SET);
            $nameUtf16 = fread($fh, 64);
            $nameLength = self::_readInt2($fh);
            $nameUtf16 = substr($nameUtf16, 0, $nameLength - 2);
            // Simple conversion from UTF-16LE to ISO-8859-1
            $name = str_replace("\x00", "", $nameUtf16);
            $type = self::_readInt1($fh);
            switch ($type) {
                case self::OLE_PPS_TYPE_ROOT:
                    $pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array());
                    $this->root = $pps;
                    break;
                case self::OLE_PPS_TYPE_DIR:
                    $pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null, null, null, null, null, array());
                    break;
                case self::OLE_PPS_TYPE_FILE:
                    $pps = new PHPExcel_Shared_OLE_PPS_File($name);
                    break;
                default:
                    continue; ・・・・・ここ!!
            }
            fseek($fh, 1, SEEK_CUR);
            $pps->Type    = $type;
            $pps->Name    = $name;
            $pps->PrevPps = self::_readInt4($fh);
            $pps->NextPps = self::_readInt4($fh);
            $pps->DirPps  = self::_readInt4($fh);
            fseek($fh, 20, SEEK_CUR);

ありました。確かにdefaultの部分でbreakではなくcontinueになっていることが確認できました。

対処策:continueを「break」または「continue 2」に変更する

先ほど挙げたPHP7.3からbreakの代わりにcontinueを使うとWarningになる。にも記載があるように、使用しているPHPのバージョンが7.3以上だとこの文法は使えないようです。

なので、さっそくライブラリの当該箇所を直しちゃいましょう。

やることは簡単です。

PHPExceライブラリのOLE.phpファイルを開き、continueをbreakに変更するだけです。

そして、上書き保存します。

これだけでOKです。

プログラムを修正し、再度実行→ワーニングが取れた!

プログラムを修正して、再度、実行してみたところWarning個所はなくなりました。

これで無事にPHPExcelはエラー無く使っていくことができます。

余談:そもそもの原因

余談ですが、そもそもの原因として、PHPExcelライブラリの開発が2017年を最後に終了しているようですね。

当時はまだPHP7.3が出ていなかったので問題にはならなかったようですが、現在のPHPバージョンが最新だと、更新が追い付いていないPHPExcelライブラリではエラーが発生するようです。

そして現在(2020年6月21日)だと、PHPExcelの後継であるPHPSpreadsheetを使うことが推奨されているようです。

なので私も、PHPSpreadsheetライブラリを使っていくことにしました。

まとめ

  • 今回のWarningの直接の原因は、switch文でcontinueを使っていた。
  • 根本の原因は、最新ではないライブラリを使っていた。
  • PHP7.3では、その使い方はNGだったが、使用したライブラリが古く、旧方式のプログラムとなっていたことで発生した。
  • PHPExcelライブラリはもう非推奨。特別な理由がない限り、使わなくていい。
  • 2020年6月21日現在以降は、PHPSpreadsheetライブラリを使うこと。

PHPにしかり、Web技術にしかり、移り変わりのスピードはとても速いので、常に最新の情報を得ることが必要ですね(^^;