技術メモ

PhpSpreadsheetのインストールと少し感想

PHPからグラフ付きのExcelファイルを作ってダウンロードさせる機能を構築すべく、PhpSpreadsheetをインストールしました。少しつまづいたのでそのつめあとを残します。

※PHPExcelが非推奨となって、その後継がPhpSpreadsheetのようです。

ちなみにPHPは7.1です。

1.composerインストール

PhpSpreadsheetのインストールはcomposerを使うので、composerが入っていない場合はインストールします。

 php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
 php composer-setup.php
 php -r "unlink('composer-setup.php');"
 mv composer.phar /usr/local/bin/composer

2.PhpSpreadsheetインストール

composer.jsonを、インストールしたいディレクトリに作成します。

例:

{
 "require": {
 "phpoffice/phpspreadsheet": "^1.2"
 }
}

インストールします。

 composer require "phpoffice/phpspreadsheet"

するとなにやらエラーが。

Using version ^1.2 for phpoffice/phpspreadsheet
 ./composer.json has been updated
 Loading composer repositories with package information
 Updating dependencies (including require-dev)
 Your requirements could not be resolved to an installable set of packages.

Problem 1
 - phpoffice/phpspreadsheet 1.2.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
 - phpoffice/phpspreadsheet 1.2.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
 - Installation request for phpoffice/phpspreadsheet ^1.2 -> satisfiable by phpoffice/phpspreadsheet[1.2.0, 1.2.1].

To enable extensions, verify that they are enabled in your .ini files:
 - /etc/php.ini
 - /etc/php.d/10-opcache.ini
 - /etc/php.d/20-bz2.ini
 - /etc/php.d/20-calendar.ini
 - /etc/php.d/20-ctype.ini
 - /etc/php.d/20-curl.ini
 - /etc/php.d/20-dom.ini
 - /etc/php.d/20-exif.ini
 - /etc/php.d/20-fileinfo.ini
 - /etc/php.d/20-ftp.ini
 - /etc/php.d/20-gd.ini
 - /etc/php.d/20-gettext.ini
 - /etc/php.d/20-iconv.ini
 - /etc/php.d/20-json.ini
 - /etc/php.d/20-mbstring.ini
 - /etc/php.d/20-mcrypt.ini
 - /etc/php.d/20-mysqlnd.ini
 - /etc/php.d/20-pdo.ini
 - /etc/php.d/20-phar.ini
 - /etc/php.d/20-simplexml.ini
 - /etc/php.d/20-sockets.ini
 - /etc/php.d/20-sqlite3.ini
 - /etc/php.d/20-tokenizer.ini
 - /etc/php.d/20-xml.ini
 - /etc/php.d/20-xmlwriter.ini
 - /etc/php.d/20-xsl.ini
 - /etc/php.d/30-mysqli.ini
 - /etc/php.d/30-pdo_mysql.ini
 - /etc/php.d/30-pdo_sqlite.ini
 - /etc/php.d/30-wddx.ini
 - /etc/php.d/30-xmlreader.ini
 You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

Installation failed, reverting ./composer.json to its original content.

zipがねーよって言ってるように聞こえるので、zipをインストールしてみます。

 yum -y install --enablerepo=remi,remi-php71 php-zip

再度インストールしてみます。

composer require "phpoffice/phpspreadsheet"

できました!!

 Using version ^1.2 for phpoffice/phpspreadsheet
 ./composer.json has been updated
 Loading composer repositories with package information
 Updating dependencies (including require-dev)
 Package operations: 2 installs, 0 updates, 0 removals
 - Installing psr/simple-cache (1.0.1): Downloading (100%)
 - Installing phpoffice/phpspreadsheet (1.2.1): Downloading (100%)
 phpoffice/phpspreadsheet suggests installing mpdf/mpdf (Option for rendering PDF with PDF Writer)
 phpoffice/phpspreadsheet suggests installing dompdf/dompdf (Option for rendering PDF with PDF Writer)
 phpoffice/phpspreadsheet suggests installing tecnick.com/tcpdf (Option for rendering PDF with PDF Writer)
 phpoffice/phpspreadsheet suggests installing jpgraph/jpgraph (Option for rendering charts, or including charts with PDF or HTML Writers)
 Writing lock file
 Generating autoload files

※このあと公式ドキュメントを見てみたら必要なエクステンションがちゃんと書いてありました。

PHP version 5.6 or newer

PHP extension php_zip enabled

PHP extension php_xml enabled

PHP extension php_gd2 enabled (if not compiled in)

3.おわりに

PhpSpreadsheetを使ってみましたが、複雑(細かい)なExcelを作るには向いてないみたいです。

例えば、

  1. 棒グラフと折れ線グラフの複合グラフが作れない。
  2. 複合グラフを作ってあるExcelファイルをテンプレートとし、それを読み込んで出力したら設定したフォントが解除され、凡例が空白になったりグラフポイントのサイズもバカデカくなったり見た目がぐちゃぐちゃに。(仕方なくブックオープン時にグラフを綺麗にするマクロを組み込みました)
  3. 数字をカンマ区切りで表示させることができない。(セルの書式設定)
  4. 配列からセルの設定をする $worksheet->fromArray で、セットする配列に空白があると勝手に詰められてしまう。例えば、[1,2, ,3]の配列をセルA1からセットすると、A1:1 B1:2 C1:空 D1:3 ではなく、A1:1 B1:2 C1:3 になる。

とかコード書いてみるといろいろ使いづらい点がでてきました。

今後のバージョンアップに期待!!