この記事は、PHPのライトなExcelライブラリの紹介です。
はじめに
PHPer皆さん、Excelは好きですか?Excel好きなユーザーから、オンライン画面でExcelからデータをインポートしたいなどの要件がくることがありますよね。そんな時はPhpSpreadsheet。PhpSpreadsheetは、スプレッドシートの読み書きや書式設定など、なんでもできるとても素晴らしいライブラリです。
ある日、PHPで特定セルの値を変更して、その結果をExcelのチャートに反映するという要件をいただきました。具体的には、図中の A3
と A5
の値を変更して、Qiita閲覧者数
のチャートで見たいという案件です。
早速PhpSpreadsheetで実装。A3
と A5
の値を変更して保存します。
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ではセルの値だけを操作することは難しいようです。(もしやり方をご存知の方がいらっしゃったら教えてください)
ということで、ライブラリを自作しました。Excelのセルの値の取得とセットだけのライトなライブラリです。セルの値を操作しても、オリジナルのExcelファイルを傷つけないことを目指しました。オリジナルのExcelファイルを傷つけないので、書式設定やチャートなどのオブジェクトは全てExcelで作成する前提です。
準備
composerでインストールしてください。download
以外は、Laravelのインストールは不要です。
composer require blocs/docs
Excelを操作する
セルの値をセットする
set
でセルの値をセットします。第一引数は シート番号(もしくはシート名)
、第二引数は 列名(もしくは列番号)
、第三引数は 行名(もしくは行番号)
、第四引数は セットする値
です。
save
で保存します。第一引数は ファイル名
です。
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ファイルを傷つけません。
download
で、WebアプリケーションからExcelファイルをダウンロードします。このメソッドは、Laravelが必要です。
$excel->download('sample.xlsx');
セルの値を取る
get
でセルの値を取ります。第一引数は シート番号(もしくはシート名)
、第二引数は 列名(もしくは列番号)
、第三引数は 行名(もしくは行番号)
です。
require_once '../vendor/autoload.php';
use Blocs\Excel;
$excel = new Excel('sample.xlsx');
$excel->get(1, 'A', '5');
第一引数は シート名
、第二引数は 列番号
、第三引数は 行番号
の例です。
$excel->get('Worksheet', 0, 4);
get
で大量のセルの値(1,000件程度)を取るには、かなり処理時間がかかります。その時は all
でシートから全てのセルの値を一括で取ってください。
$excel->all('Worksheet');
第二引数で 抜き出す列番号
を配列で指定すると、さらにパフォーマンスがよくなります。
$excel->all('Worksheet', [0]);
おわりに
最後まで読んでいただき、ありがとうございました。
いつもExcelの操作はちょっとメンドーだなと感じていたので、ライトなExcelライブラリを作ってみました。このライブラリがPHPer皆さんのプログラム開発をサポートできればいいなと思っています。