【PHP】Excelを操作するライブラリを作ってみた

:::note info
この記事は、PHPのライトなExcelライブラリの紹介です。
:::

# はじめに
PHPer皆さん、Excelは好きですか？Excel好きなユーザーから、オンライン画面でExcelからデータをインポートしたいなどの要件がくることがありますよね。そんな時はPhpSpreadsheet。PhpSpreadsheetは、スプレッドシートの読み書きや書式設定など、なんでもできるとても素晴らしいライブラリです。

https://github.com/phpoffice/phpspreadsheet

ある日、PHPで特定セルの値を変更して、その結果をExcelのチャートに反映するという要件をいただきました。具体的には、図中の `A3` と `A5` の値を変更して、`Qiita閲覧者数` のチャートで見たいという案件です。

![スクリーンショット 2024-06-28 22.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/b8583351-8d96-8a3e-556c-3d47368dfb3e.png "sample.xlsx")

早速PhpSpreadsheetで実装。`A3` と `A5`の値を変更して保存します。

```php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;

$reader = IOFactory::createReader('Xlsx');
$reader->setIncludeCharts(true);
$spreadsheet = $reader->load('sample.xlsx');

$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A3', 5);
$sheet->setCellValue('A5', 8);

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->setIncludeCharts(true);
$writer->save('sample.xlsx');
```

あれ、赤い破線のオブジェクトが消えちゃった。棒グラフが心もち太くなっているような。残念ながら、PhpSpreadsheetではセルの値だけを操作することは難しいようです。（もしやり方をご存知の方がいらっしゃったら教えてください）

![スクリーンショット 2024-06-28 22.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/327be88f-ea0d-b165-31b1-c9b439890b41.png "sample.xlsx")

ということで、ライブラリを自作しました。Excelのセルの値の取得とセットだけのライトなライブラリです。セルの値を操作しても、オリジナルのExcelファイルを傷つけないことを目指しました。オリジナルのExcelファイルを傷つけないので、書式設定やチャートなどのオブジェクトは全てExcelで作成する前提です。

# 準備
composerでインストールしてください。`download` 以外は、Laravelのインストールは不要です。

https://github.com/blocs/docs

:::note info
composer require blocs/docs
:::

# Excelを操作する

## セルの値をセットする
`set` でセルの値をセットします。第一引数は `シート番号(もしくはシート名)`、第二引数は `列名(もしくは列番号)`、第三引数は `行名(もしくは行番号)`、第四引数は `セットする値` です。
`save` で保存します。第一引数は `ファイル名` です。

```php
require_once '../vendor/autoload.php';

use Blocs\Excel;

$excel = new Excel('sample.xlsx');
$excel->set(1, 'A', '3', 5);
$excel->set(1, 'A', '5', 8);
$excel->save('sample.xlsx');
```

オブジェクトが消えずにセルの値をセットできました。値の変更以外は、オリジナルのExcelファイルを傷つけません。

![スクリーンショット 2024-06-28 22.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/0d52104a-09ef-042a-5bed-15e88084f6c7.png "sample.xlsx")

`download` で、WebアプリケーションからExcelファイルをダウンロードします。このメソッドは、Laravelが必要です。

```php
$excel->download('sample.xlsx');
```

## セルの値を取る
`get` でセルの値を取ります。第一引数は `シート番号(もしくはシート名)`、第二引数は `列名(もしくは列番号)`、第三引数は `行名(もしくは行番号)` です。

```php
require_once '../vendor/autoload.php';

use Blocs\Excel;

$excel = new Excel('sample.xlsx');
$excel->get(1, 'A', '5');
```

第一引数は `シート名`、第二引数は `列番号`、第三引数は `行番号` の例です。

```php
$excel->get('Worksheet', 0, 4);
```

`get` で大量のセルの値（1,000件程度）を取るには、かなり処理時間がかかります。その時は `all` でシートから全てのセルの値を一括で取ってください。

```php
$excel->all('Worksheet');
```

第二引数で `抜き出す列番号` を配列で指定すると、さらにパフォーマンスがよくなります。

```php
$excel->all('Worksheet', [0]);
```

# おわりに
最後まで読んでいただき、ありがとうございました。
いつもExcelの操作はちょっとメンドーだなと感じていたので、ライトなExcelライブラリを作ってみました。このライブラリがPHPer皆さんのプログラム開発をサポートできればいいなと思っています。

# 関連サイト
1. [GitHub](https://github.com/blocs/docs)
2. [Packagist](https://packagist.org/packages/blocs/docs)
3. [サービスサイト](https://blocs.jp)
4. [Qiita:【Laravel】ドキュメント生成ツールを作ってみた](https://qiita.com/hyada/items/c40ae6a8fc6fff05c243)