PHPExcelを動かしてみた


後継のPHPSpreadsheetの登場により、すでにメンテナンス対象外で、アーカイブされているPHPExcel。
ですが、PHPの動作環境上やむを得ず使用することになり、試しに動かしてみたので、覚え書きしておきます。

## 環境

* OS: Amazon Linux2
* PHP: 5.4.16


→ 本記事では、EC2インスタンスは準備済を想定。PHPのインストールから行います

## 事前準備

EC2インスタンスにSSH接続して、以下を実行。

### PHP5系のインストール

[Remi's RPM repository - Configuration wizard | rpms.remirepo.net](https://rpms.remirepo.net/wizard/)
にアクセスして、以下の通り設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/9b928c90-5fea-0fe4-da6c-9a4f33325aa1.png)

PHPのバージョンは動作環境にいちばん近い5.4.45を選択しました。

基本的には、上記の通り選択すると出現するコマンドを上から順に実行していくだけですが、こちらも記載しておきます（必要に応じて、sudoやyオプションを付けました）。

```sh:実行コマンド
# EPELリポジトリのコンフィギュレーションパッケージをインストール
$ sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# Remiリポジトリのコンフィギュレーションパッケージをインストール
$ sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

# yum-utilパッケージをインストール
$ sudo yum -y install yum-utils

# PHP5.4のリポジトリのみ有効にする
$ sudo yum-config-manager --disable 'remi-php*'
$ sudo yum-config-manager --enable   remi-php54

# 有効なリポジトリの一覧を確認
$ yum repolist

$ sudo yum -y update

# PHPのインストール
sudo yum install -y php
```

PHPのバージョンを確認し、以下の通り出ていればOK

```sh:実行コマンドと想定結果
$ php --version
PHP 5.4.16 (cli) (built: Oct 31 2019 18:34:05)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```

### php-xmlのインストール

PHPExcelでは、XMLWriterを継承している箇所があります。
XMLWriterを使用するには、php-xmlが必要なので、こちらもインストールしておきます。

```sh:実行コマンド
sudo yum -y install php-xml
```

### Gitのインストール

GitHubより、リポジトリを取得するので、Gitのインストールがまだの場合はこちらも入れておきましょう。

```sh:実行コマンド
sudo yum -y install git-all
```

※参考: [Git - Gitのインストール | git-scm.com](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

### PHPExcelリポジトリの取得

GitHubより、PHPExcelをクローンします。
[01-Getting-Started.md](https://github.com/PHPOffice/PHPExcel/blob/1.8/Documentation/markdown/Overview/01-Getting-Started.md)によれば、Classes配下があればOKとのことですが、サンプル等もすぐ参照できるようまるっと取得しておきます。

```sh:
# 今回は、/usr/lib配下に配置
$ cd /usr/lib

$ sudo git clone https://github.com/PHPOffice/PHPExcel
```

## お試し実行

お試しとして、以下の2パターンをやってみました。

(1) 新規Excelファイルを作成して値を書き込む
(2) テンプレートファイルをもとに（読み込んで）Excelファイルを作成 ＆ 値を書き込む

### ディレクトリ構成

ディレクトリ構成は以下の通り

```
/develop/sample/php
     |
    php
     |----sampleMake.php → (1) 新規Excelファイルを作成して値を書き込むプログラム
     |
     |----sampleCopy.php → (2) テンプレートファイルをもとに（読み込んで）Excelファイルを作成 ＆ 値を書き込む
     | 
     |---- templates → テンプレート格納先                
     |      |---- sample.xlsx → テンプレートとなるExcelファイル（(2)で使用）                  
     | 
     |---- outputs → 出力ファイル格納先
     |      |---- sampleMake.xlsx → sampleMake.php (1) の実行により、作成されるファイル
     |      |---- sampleCopy.xlsx → sampleCopy.php (2) の実行により、作成されるファイル
```

### (1) 新規Excelファイルを作成して値を書き込む

サンプルコードは以下の通り（エラーハンドリングはせず、最低限の内容にしています: (2)も同様）
PHPExcel本家のサンプルコード [01simple.php](https://github.com/PHPOffice/PHPExcel/blob/1.8/Examples/01simple.php) を参考にしています。

```php:サンプルコード
<?php

require_once '/usr/lib/PHPExcel/Classes/PHPExcel.php';

date_default_timezone_set('Asia/Tokyo');

// 出力ファイルに関する定義
$outputFileType = 'Excel2007';
$outputFileName = 'outputs/sampleMake.xlsx';

$objPHPExcel = new PHPExcel();

// 0枚目のシートのセルに値をセット
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'PHPExcel')
            ->setCellValue('A2', 'test');

// アクティブシートに名前をつける
$objPHPExcel->getActiveSheet()->setTitle('テスト');

// Excelファイルを作成＆保存
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $outputFileType);
$objWriter->save($outputFileName);
```

outputsに出力されるsampleMake.xlsxの内容は以下の通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/2d40a69b-1cc3-77cc-8004-045bbaa6613a.png)

### (2) テンプレートファイルをもとに（読み込んで）Excelファイルを作成 ＆ 値を書き込む

テンプレートファイルの内容は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e4062094-28f5-7925-994f-3d6b5ede3e9c.png)

以下、サンプルコード
PHPExcel本家のサンプルコード [31docproperties_write.php](https://github.com/PHPOffice/PHPExcel/blob/1.8/Examples/31docproperties_write.php) を参考にしています。

```php:サンプルコード
<?php

require_once '/usr/lib/PHPExcel/Classes/PHPExcel/IOFactory.php';

date_default_timezone_set('Asia/Tokyo');

// 各種定義
$inputFileType = 'Excel2007';
$inputFileName = 'templates/sample.xlsx';
$outputFileType = 'Excel2007';
$outputFileName = 'outputs/sampleCopy.xlsx';


// テンプレートファイルの読み込み
$objPHPExcelReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objPHPExcelReader->load($inputFileName);

// 値の書き込み
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('C3', 51)
            ->setCellValue('C4', 67)
            ->setCellValue('C5', 49)
            ->setCellValue('C6', 56)
            ->setCellValue('C7', 71)
            ->setCellValue('C8', 62);

// ファイルを保存
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $outputFileType);
$objWriter->save($outputFileName);
```

outputsディレクトリに出力されたファイルは以下の通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/5c84973f-105d-d656-a141-feb3b003b86f.png)

## 終わりに

実行環境上、やむを得ないとはいえ、できる限りPHPSpreadsheetを使うようにしていきたいところ。
アーカイブされて時間もたってるので、本家リポジトリに記載の参照リンク先が存在しないのも地味に辛い・・

実装の際は、リプレイスしやすい内容にすることを心がけたいと思います。