PhpSpreadsheetのインストール
PHPExcelの後継ライブラリ、PhpSpreadsheetをインストールしてみます。
PhpSpreadsheetをインストールするには、必要な物が多いです。 まずインストール自体はcomposerで行うので、composerが入っている必要があります。
また、PhpSpreadsheetが正常に動作するには、zip、libxml、gd、mbstring、fileinfoなど、 主要なPHPモジュールの大半を要求します。どれかが入っていないと動かない可能性が高いので、 拡張機能を自由にインストールできる環境がほぼ必須になります。

cd /usr/local/php-8.4.2/lib/php
composer require phpoffice/phpspreadsheet

コマンドは1個だけなんですけど、色々考慮点があります。
まず、ネット情報では composer init というコマンドを実行しろという情報がありますが、 私が試したときは不要でも行けました。
次に、composer requireはどこで実行すればいいの? 「プロジェクトのルートディレクトリで実行しろ」と言われることが多いみたいですが、 あくまでPhpSpreadsheetを入れたいだけで、プロジェクトとか別に作るつもりはないんじゃが… というときは、php.iniで定義したinclude_pathが通っている場所が良いと思います。 デフォルトではPHPのインストールディレクトリが/usr/localだとすると、 /usr/local/lib/php という場所になります。
その際、rootユーザーになって実行しようとすると危険だからやめろと警告されます。 rootで行くしかないのならyesと打って突き進むしかありませんが、 他のユーザーでその位置に書き込み可能ならばroot以外のユーザーで行った方が良いです。
インストールが終わると、作業ディレクトリに composer.json、composer.lock という2つのファイルとvendorというディレクトリが残されます。 原理的にいえば、include_pathが通っている場所ならどこに移しても構わないみたいです。
例えば、誤って別の変な場所で実行してしまった場合は、次のようにして正規の場所に移動すればokです。

sudo mv -i composer.json composer.lock vendor /usr/local/php-8.4.2/lib/php/.


動作確認はハローワールド
とにかくすぐ動作を確認したい場合はこれ。

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');

$writer = new Xlsx($spreadsheet);
$writer->save('helloworld.xlsx');


PhpSpreadsheetを使う
既存のExcelファイルを開き、セルの値を読み取って表示するサンプルです。

<?php
/*====================================================================*
 * PhpSpreadsheetで既存のExcelファイルを開いてセルの値を表示するサンプル
 *====================================================================*/
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;

$reader = new XlsxReader();
$ss = $reader->load('./input/order-sample.xlsx');
$s = $ss->getSheet(0);

// 引数は「列、行」の順番。
// 古いバージョンでは列は0、行は1から開始していたが、
// 現在は両方とも1からになったらしい
print($s->getCellByColumnAndRow(2, 6)->getValue() . "\n");
print($s->getCellByColumnAndRow(4, 6)->getValue() . "\n");
print($s->getCellByColumnAndRow(6, 6)->getValue() . "\n");
print($s->getCellByColumnAndRow(7, 6)->getValue() . "\n");
print("------------\n");

// セル位置でも参照できる
print($s->getCell("B6")->getValue() . "\n");
print($s->getCell("D6")->getValue() . "\n");
print($s->getCell("F6")->getValue() . "\n");
print($s->getCell("G6")->getValue() . "\n");
print("------------\n");

// 上の例では、日付は数値として、式は計算後の値ではなく式自体で表示されてしまう。
// 下のようにすると、それぞれ日付形式と式の計算後の値で表示される。
print($s->getCell("B6")->getValue() . "\n");
print($s->getCell("D6")->getFormattedValue() . "\n");
print($s->getCell("F6")->getValue() . "\n");
print($s->getCell("G6")->getCalculatedValue() . "\n");
// end.

新規のExcelファイルを作成し、固定の文字を出力するサンプルです。

<?php
/*====================================================================*
 * PhpSpreadsheetで新規Excelファイルに固定の文字を出力するサンプル
 *
 * 公式のここを読めば大体わかる
https://phpspreadsheet.readthedocs.io/en/latest/topics/accessing-cells/
 *====================================================================*/
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;

$ss = new Spreadsheet();
$s = $ss->getActiveSheet();

$s->setTitle("出力データ");

// 列幅を調整。B,C列(Indexで1,2)の幅を調整している
$s->getColumnDimensionByColumn(1)->setWidth(14);
$s->getColumnDimensionByColumn(2)->setWidth(14);

$s->setCellValue("B3", "こんにちは。");
$s->setCellValue("B4", 1234.5);
$s->setCellValue("B5", "2020/04/22");

use \PhpOffice\PhpSpreadsheet\Cell\DataType;
use \PhpOffice\PhpSpreadsheet\Shared\Date;
//use \PhpOffice\PhpSpreadsheet\Style\NumberFormat;

$s->setCellValue("C3", "こんにちは。");
// PhpSpreadsheetではJavaのPOIと逆で、数値型データは普通に設定すると
// Excelで数値書式になり、先頭0は削除され右詰めになる。
// 文字列書式にしたい場合に明示的に文字列型を指定する必要がある。
$s->setCellValueExplicit("C4", 1234.5, DataType::TYPE_STRING);
// 一方日付データはPHPの世界でExcelの日付形式に変換した上で、
// セルの書式も日付の物を設定する必要がある。
$d = mktime(0, 0, 0, 4, 22, 2020);
$xld = Date::PHPToExcel($d);
$s->setCellValue("C5", $xld);
// ↓日本語環境だと22-4/20のような変な表示になる
//$s->getStyle("C5")->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_DATETIME);
$s->getStyle("C5")->getNumberFormat()->setFormatCode("YYYY-MM-DD");

// セルのスタイルを設定
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;

// 見出し行のセル。薄い緑で塗りつぶし、四辺を細い線で囲む
// 引数は「1列目3行目 - 2列目3行目」の範囲を表す
// (列は0、行は1から開始する点に注意)
$s->getStyleByColumnAndRow(1, 3, 2, 3)->applyFromArray(
  ['fill' => [
     'fillType' => Fill::FILL_SOLID,
     'color' => ['argb' => 'FFCCFFCC'], ],
     'borders' => [
       'allBorders' => ['borderStyle' => Border::BORDER_THIN], ],
  ] );

// データ行のセル。四辺を細い線で囲む
// 引数は「1列目4行目 - 2列目5行目」の範囲を表す
$s->getStyleByColumnAndRow(1, 4, 2, 5)->applyFromArray(
  ['borders' => [
     'allBorders' => ['borderStyle' => Border::BORDER_THIN], ],
  ] );

// リンク(Hyperlink)の設定
$s->setCellValue("D3", "こんにちは。");
$s->getCell("D3")->getHyperlink()->setUrl("C:\\work\\repo_lang\\php\\phpss\\output\\hello.txt");

$writer = new XlsxWriter($ss);
$writer->save('./output/output1.xlsx');
// end.

CSVファイルを読み、新規のExcelファイルに縦横の罫線を引いて、 テーブル状のセルに値を設定して出力するサンプルです。

<?php
/*====================================================================*
 * PhpSpreadsheetでタブ区切りテキストファイルの内容を
 * Excelファイルに出力するサンプル
 *
 * 公式のここを読めば大体わかる
https://phpspreadsheet.readthedocs.io/en/latest/topics/accessing-cells/
 *====================================================================*/
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;

// 改行も含めて全体を読み込む
$data = file_get_contents("shiten-utf8.dat");

// 新規作成
$ss = new Spreadsheet();
$s = $ss->getActiveSheet();
$s->setTitle("出力データ");

// 列幅を調整
$s->getColumnDimensionByColumn(1)->setWidth(12);
$s->getColumnDimensionByColumn(2)->setWidth(12);
$s->getColumnDimensionByColumn(3)->setWidth(10);
$s->getColumnDimensionByColumn(4)->setWidth(30);
$s->getColumnDimensionByColumn(5)->setWidth(12);

// 見出し行の設定
$rowarr = [ "支店コード", "支店名称", "地域", "所在地", "従業員数" ];
$s->fromArray($rowarr, NULL, "A1");

// 値の設定
// PhpSpreadsheetはセル1個ずつ値を設定する必要がなく、
// fromArray()で一次元または二次元配列から一度に値を設定できる。
// 反面、"B3"と(1,3)を変換する仕組みがないため関数によって目視で
// 読み替えるとか、結構ややこしい部分がある。
$startRowno = 2;
$startColno = 1;
$rowno = $startRowno;
foreach(explode("\r\n", $data) as $rowdata){
    $rowarr = explode("\t", $rowdata);
    $s->fromArray($rowarr, NULL, "A".($rowno++));
}

// セルのスタイルを設定
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;

// 見出し行のセル。薄い緑で塗りつぶし、四辺を細い線で囲む
// 引数は範囲のそれぞれ端の位置を指定する。左上端からの差分ではないので注意。
$s->getStyleByColumnAndRow($startColno, 1, $startColno+5-1, 1)->applyFromArray(
  ['fill' => [
     'fillType' => Fill::FILL_SOLID,
     'color' => ['argb' => 'FFCCFFCC'], ],
     'borders' => [
       'allBorders' => ['borderStyle' => Border::BORDER_THIN], ],
  ] );

// データ行のセル。四辺を細い線で囲む
$s->getStyleByColumnAndRow($startColno, $startRowno, $startColno+5-1, $rowno-2)->applyFromArray(
  ['borders' => [
     'allBorders' => ['borderStyle' => Border::BORDER_THIN], ],
  ] );

// ファイル出力
$writer = new XlsxWriter($ss);
$writer->save('./output/output-php-ss.xlsx');
// end.

Open Source Web Architecture Top

(first uploaded 2020/05/06 last updated 2025/01/05, MISUMI URANO)