5
5

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

はじめに

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

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

スクリーンショット 2024-06-28 22.21.36.png

早速PhpSpreadsheetで実装。A3A5の値を変更して保存します。

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

ということで、ライブラリを自作しました。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ファイルを傷つけません。

スクリーンショット 2024-06-28 22.21.08.png

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皆さんのプログラム開発をサポートできればいいなと思っています。

関連サイト

  1. GitHub
  2. Packagist
  3. サービスサイト
  4. Qiita:【Laravel】ドキュメント生成ツールを作ってみた
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5