📖

PHPで簡単にExcelを操作可能にする「PhpSpreadsheet」の使い方のメモ

に公開

PHPでExcelファイルを簡単に扱える「PhpSpreadsheet」というライブラリの使い方を、メモとして残しておくことにしました。

PhpSpreadsheetについて

PhpSpreadsheetは、ExcelやスプレッドシートをPHP上で簡単に扱えるようにするためのPHPライブラリです。
PHPExcelの後継として開発されました。
特徴としては次のような内容があげられます。

  • 無料
  • xls、xlsx、CSV、PDFに対応
  • データはもちろん、演算や装飾などにも対応

https://github.com/PHPOffice/PhpSpreadsheet

注意点

PhpSpreadsheetはデータ容量や処理の仕方によってメモリを多く消費します。
物理的なメモリやPHPの設定で増やしたり、処理中で解放するなど回避をする必要になる場合があります。

前提条件

  • composerがインストールされている
  • 2025年4月の時点での最新版ではPHP 8.1以上が必要(PHP 8.0は2.1.9、PHP 7.4は1.29.10、PHP 5.6は1.8.2で対応)
  • ZipArchiveクラスが必要(PHPの設定でextension=zipを解放)

インストール

使用したいプロジェクトのディレクトリへ移動し、コマンドラインから次のコマンドを実行してインストールします。

composer require phpoffice/phpspreadsheet

composer.jsonファイルからインストールする場合は次のように記述し、composer installコマンドを実行してインストールします。

{
  "require": {
    "phpoffice/phpspreadsheet": "*"
  }
}
composer install

使い方

クラス(ライブラリ)の読み込み

最低限次のコードのようにベースとなるクラスを読み込みます。

require('vendor/autoload.php');

あとは名前空間が長いので短く扱うため、useキーワードで必要に応じて各クラスを参照します。

// スプレッドシート作成などのクラス
use PhpOffice\PhpSpreadsheet\Spreadsheet;

// XLSを読み込む操作のクラス
use PhpOffice\PhpSpreadsheet\Reader\Xls as XlsReader;

// XLSXを読み込む操作のクラス
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;

// XLSXとして書き込む操作のクラス
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;

// CSVを読み込む操作のクラス
use PhpOffice\PhpSpreadsheet\Reader\Csv as CsvReader;

// CSVとして書き込む操作のクラス
use PhpOffice\PhpSpreadsheet\Writer\Csv as CsvWriter;

// 日付を扱うためのクラス
use PhpOffice\PhpSpreadsheet\Shared\Date as Date;

// 数値の書式を扱うためのクラス
use PhpOffice\PhpSpreadsheet\Style\NumberFormat as NumberFormat;

// 水平・垂直揃えを扱うためのクラス
use PhpOffice\PhpSpreadsheet\Style\Alignment as Alignment;

// 罫線を扱うためのクラス
use PhpOffice\PhpSpreadsheet\Style\Border as Border;

// 塗り潰しを扱うためのクラス
use PhpOffice\PhpSpreadsheet\Style\Fill as Fill;

// 画像を扱うためのクラス
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

スプレッドシードの作成

Spreadsheetクラスで新規にスプレッドシートを作成します。

require('vendor/autoload.php');

use PhpOffice\PhpSpreadsheet\Spreadsheet;

$spreadsheet = new Spreadsheet();

スプレッドシードの作成

Spreadsheetクラスで新規にスプレッドシートを作成します。

require('vendor/autoload.php');

use PhpOffice\PhpSpreadsheet\Spreadsheet;

$spreadsheet = new Spreadsheet();

このクラスはインスタンスを作成すると、自動的に1つのワークシートが作られ、アクティブ状態になります。

ファイルの読み込み

名前空間のReaderで各形式にあわせたクラスでファイルを読み込むことができます。
例えばXLSXの場合は、Reader\Xlsxクラスのloadメソッドでファイルを読み込みます。

require('vendor/autoload.php');

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;

$reader = new Reader();

$spreadsheet = $reader->load('sample.xlsx');

戻り値はSpreadsheetクラスのインスタンスを返します。

ファイルに保存

名前空間のWriterで各形式にあわせたクラスでファイルの書き出しをすることができます。
例えばXLSXの場合は、Writer\Xlsxクラスのsaveメソッドでファイルへの書き込みを行います。

引数 必須/任意 初期値 説明
第一引数 必須 string 保存先パス(ファイル名を含む)
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;

$writer = new Writer($spreadsheet);

$writer->save('../output/sample.xlsx');

ワークシートを参照

ワークシートを参照する方法は3通りあります。

1つ目はgetActiveSheetメソッドで、現在のアクティブなワークシートを参照します。

$worksheet = $spreadsheet->getActiveSheet();

2つ目はgetSheetByNameメソッドで、シート名でワークシートを参照します。

引数 必須/任意 初期値 説明
第一引数 必須 string 参照したいシート名を指定します。
$worksheet = $spreadsheet->getSheetByName('Sheet1');

3つ目はgetSheetメソッドで、インデックス番号でワークシートを参照します。

引数 必須/任意 初期値 説明
第一引数 必須 string 参照したいシート名を指定します。
$worksheet = $spreadsheet->getSheet(0);

ワークシートをアクティブにする

ワークシートをアクティブする方法は2通りあります。

1つ目はsetActiveSheetIndexByNameメソッドで、シート名でワークシートをアクティブにします。

引数 必須/任意 初期値 説明
第一引数 必須 string アクティブにしたいシート名を指定します。
$worksheet = $spreadsheet->setActiveSheetIndexByName('Sheet1');

2つ目はsetActiveSheetIndexメソッドで、インデックス番号でワークシートをアクティブにします。

引数 必須/任意 初期値 説明
第一引数 必須 string アクティブにしたいシート名を指定します。
$worksheet = $spreadsheet->setActiveSheetIndex(0);

ワークシートを作成

createSheetメソッドを使用することで、ワークシートを作成することができます。
戻り値は作成したワークシートを返します。

引数 必須/任意 初期値 説明
第一引数 任意 int null 作成する先(ワークシート)のインデックス番号。省略した場合は末尾に作成される。
// 末尾に作成
$worksheet = $spreadsheet->createSheet();

// 2つ目に作成
$worksheet = $spreadsheet->createSheet(1);

ワークシートを削除

createSheetメソッドを使用することで、ワークシートを作成することができます。

引数 必須/任意 初期値 説明
第一引数 必須 int 削除するワークシートのインデックス番号。
$spreadsheet->removeSheetByIndex(0);

シート名の変更

setTitleメソッドを使用することで、参照中のワークシートのシート名を変更することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 設定するシート名を指定します。
$spreadsheet->getActiveSheet()->setTitle('あいうえお');

セルを参照

getCellメソッドを使用することで、セルを参照することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string | array 参照したいセル番号を指定します。「A3」という列のアルファベットと行番号を組み合わせた文字列か、[列番号, 行番号]のように配列で指定する方法があります。
$cell = $spreadsheet->getActiveSheet()->getCell('A3');

// 列番号(位置)、行番号(位置)の場合
$cell = $spreadsheet->getActiveSheet()->getCell([1, 3]);

列(カラム)を参照

getColumnDimensionメソッドを使用することで、列(カラム)を参照することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 参照したい列のアルファベットを指定します。
$col = $spreadsheet->getActiveSheet()->getColumnDimension('A');

列そのものであって、その列のセルを参照しているわけではないことに注意してください。

行を参照

getRowDimensionメソッドを使用することで、列(カラム)を参照することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 参照したい行番号(インデックス番号ではない)を指定します。
$row = $spreadsheet->getActiveSheet()->getRowDimension(1);

セルの値を取得

セルの値を取得する方法は3つほどあります。

1つ目はgetValueメソッドを使用する方法です。
こちらは内部の値をそのまま取得します。
式が含まれる場合は式そのものの値、書式が適用されている場合は適用されていない値を返します。

$cell = $spreadsheet->getActiveSheet()->getCell('A3');
echo $cell->getValue();

2つ目はgetValueStringメソッドを使用する方法です。
基本的にはgetValueメソッドと同じですが、数値などは文字列に変換されます。

$cell = $spreadsheet->getActiveSheet()->getCell('A3');
echo $cell->getValueString();

3つ目はgetFormattedValueメソッドを使用する方法です。
式の結果や書式が適用された状態の値を返します。

$cell = $spreadsheet->getActiveSheet()->getCell('A3');
echo $cell->getFormattedValue();

セルに値を設定(代入)

セルに値を設定(代入)する方法は2つほどあります。

1つ目はsetCellValueメソッドで、ワークシートを基準にセルを指定して値を設定(代入)します。

引数 必須/任意 初期値 説明
第一引数 必須 string | array 設定(代入)の対象となるセルの列行番号を指定します。「A3」という列のアルファベットと行番号を組み合わせた文字列か、[列番号, 行番号]のように配列で指定する方法があります。
第二引数 必須 mixed 設定(代入)する値を指定します。
第三引数 任意 null | IValueBinder null 不明
$worksheet = $spreadsheet->getActiveSheet();

// 文字列
$worksheet->setCellValue('A1', 'Hello');

// 文字列(改行あり)
$worksheet->setCellValue('A1', "Hello\nWorld");

// 数値
$worksheet->setCellValue('A1', 123);

// 数式
$worksheet->setCellValue('A1', '=1+2+3');

// 日付(PhpOffice\PhpSpreadsheet\Shared\Date)
$worksheet->setCellValue('A1', Date::PHPToExcel(gmmktime(0, 0, 0, 12, 31, 2008)));

2つ目はsetValueメソッドで、参照されたセルに対して値を設定(代入)します。

引数 必須/任意 初期値 説明
第一引数 必須 mixed 設定(代入)する値を指定します。
第二引数 任意 null | IValueBinder null 不明
$cell = $spreadsheet->getActiveSheet()->getCell('A3');

// 文字列
$cell->setValue('Hello');

// 文字列(改行あり)
$cell->setValue("Hello\nWorld");

// 数値
$cell->setValue(123);

// 数式
$cell->setValue('=1+2+3');

// 日付(PhpOffice\PhpSpreadsheet\Shared\Date)
$cell->setValue(Date::PHPToExcel(gmmktime(0, 0, 0, 12, 31, 2008)));

何れの方法も、式や日付なども設定(代入)することができます。

配列からセルに値を設定(代入)

fromArrayメソッドを使用することで、配列からセルに値を設定(代入)することができます。

引数 必須/任意 初期値 説明
第一引数 必須 array 設定(代入)する値を二次元配列で指定します。
第二引数 任意 mixed null null判定とする値を設定します。
第三引数 任意 string 'A1' 設定(代入)の基準となるセルの列行番号を指定します。
第四引数 任意 bool false 設定(代入)する値がnullの判定を厳密にするかどうかを指定します。false==true===として判定します。
$worksheet->fromArray([
  ['a', 'b', 'c'],
  ['d', 'e', 'f']
], null, 'A3');

列を挿入(追加)

insertNewColumnBeforeメソッドを使用することで、列を挿入(追加)することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 挿入を開始する列番号(アルファベット)を指定します。
第二引数 任意 int 1 挿入する数を指定します。
$spreadsheet->getActiveSheet()->insertNewColumnBefore('B', 2); // B列を基準に2列挿入

行を挿入(追加)

insertNewRowBeforeメソッドを使用することで、行を挿入(追加)することができます。

引数 必須/任意 初期値 説明
第一引数 必須 int 挿入を開始する行番号を指定します。
第二引数 任意 int 1 挿入する数を指定します。
$spreadsheet->getActiveSheet()->insertNewRowBefore(3, 2); // 3行目を基準に2列挿入

列を削除

removeColumnメソッドを使用することで、列を削除することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 削除する列を指定します。
第二引数 任意 int 1 第一引数から何個削除するかを指定します。
$spreadsheet->getActiveSheet()->removeColumn('B'); // B列を削除

行を削除

removeRowメソッドを使用することで、を削除することができます。

引数 必須/任意 初期値 説明
第一引数 必須 int 削除する行を指定します。
第二引数 任意 int 1 第一引数から何個削除するかを指定します。
$spreadsheet->getActiveSheet()->removeRow(2); // 2行目を削除

データが入っているセルの範囲を取得

calculateWorksheetDimensionメソッドを使用することで、データが入っているセルの範囲を取得することができます。
「A1:C4」といった感じの文字列で返します。

$range = $spreadsheet->getActiveSheet()->calculateWorksheetDimension();

セルの範囲から値を全て取得

rangeToArrayメソッドを使用することで、セルの範囲から値を全て取得することができます。
戻り値は二次元配列で返します。

引数 必須/任意 初期値 説明
第一引数 必須 string セルの範囲を「A1:C4」といった感じの文字列で指定します。
第二引数 任意 mixed null null判定とする値を設定します。
第三引数 任意 bool true 式など計算した結果を返すかどうかを指定します。falseで式そのものを返すようになります。
第四引数 任意 bool true 書式を適用した結果を返すかどうかを指定します。falseで値そのものを返すようになります。
第五引数 任意 bool false キーを列行の番号の入り方を指定します。trueで二次元目のキーが「A」のようなアルファベットになります。
第六引数 任意 bool false 非表示の列または行を除外するかどうかを指定します。
第七引数 任意 bool false 不明
$data = $spreadsheet->getActiveSheet()->rangeToArray('A1:E5');

セルの結合・解除

getStyleメソッドを使用することで、セルを結合することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 結合するセルの範囲を指定します。
$spreadsheet->getActiveSheet()->mergeCells('A1:D4');

またunmergeCellsメソッドを使用することで、結合を解除することができます。

$spreadsheet->getActiveSheet()->unmergeCells('A1:D4');

リンクのURLを設定・取得

getHyperlink()->setUrlメソッドを使用することで、セルにリンクのURLを設定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 設定するURLを指定します。
$spreadsheet->getActiveSheet()->getCell('A1')->getHyperlink()->setUrl('https://www.example.com/');

また、getHyperlink()->getUrlメソッドを使用することで、セルに設定されているリンク先のURLを取得することができます。

$url = $spreadsheet->getActiveSheet()->getCell('A1')->getHyperlink()->getUrl();

セルのスタイルオブジェクトの取得

getStyleメソッドを使用することで、あるセルのスタイルオブジェクトを取得することができます。
スタイルオブジェクトはスタイルに関する操作を行うためのオブジェクトです。

$style = $spreadsheet->getActiveSheet()->getStyle('A1');

// 範囲
$style = $spreadsheet->getActiveSheet()->getStyle('A1:E6');

なお、初期の全体のスタイルはgetDefaultStyleメソッドでオブジェクトを取得することができます。

$defaultStyle = $spreadsheet->getActiveSheet()->getDefaultStyle();

セルの書式を設定

getNumberFormat()->setFormatCodeメソッドを使用することで、セルの書式を設定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 設定する書式を指定します。
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;

... 中略 ...

$style = $spreadsheet->getActiveSheet()->getStyle('A1');

// 文字列
$style->getNumberFormat()->setFormatCode('@');

// 数字の3桁区切り
$style->getNumberFormat()->setFormatCode('#,##0');

// 0.00%
$style->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_PERCENTAGE_00);

// 1970-01-01 01:23:45
$style->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATETIME);

// 1970-01-01
$style->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_YYYYMMDD);

// 1970/01/01
$style->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

// 01:23:45
$style->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_TIME5);

PhpOffice\PhpSpreadsheet\Style\NumberFormatには、書式の定数が用意されています。

定数 書式
FORMAT_TEXT @
FORMAT_NUMBER 0
FORMAT_NUMBER_0 0.0
FORMAT_NUMBER_00 0.00
FORMAT_NUMBER_COMMA_SEPARATED1 #,##0.00
FORMAT_NUMBER_COMMA_SEPARATED2 #,##0.00_-
FORMAT_PERCENTAGE 0%
FORMAT_PERCENTAGE_0 0.0%
FORMAT_PERCENTAGE_00 0.00%
FORMAT_DATE_YYYYMMDD yyyy-mm-dd
FORMAT_DATE_DDMMYYYY dd/mm/yyyy
FORMAT_DATE_DMYSLASH d/m/yy
FORMAT_DATE_DMYMINUS d-m-yy
FORMAT_DATE_DMMINUS d-m
FORMAT_DATE_MYMINUS m-yy
FORMAT_DATE_XLSX14 mm-dd-yy
FORMAT_DATE_XLSX14_ACTUAL m/d/yyyy
FORMAT_DATE_XLSX15 d-mmm-yy
FORMAT_DATE_XLSX16 d-mmm
FORMAT_DATE_XLSX17 mmm-yy
FORMAT_DATE_XLSX22 m/d/yy h:mm
FORMAT_DATE_XLSX22_ACTUAL m/d/yyyy h:mm
FORMAT_DATE_DATETIME d/m/yy h:mm
FORMAT_DATE_TIME1 h:mm AM/PM
FORMAT_DATE_TIME2 h:mm:ss AM/PM
FORMAT_DATE_TIME3 h:mm
FORMAT_DATE_TIME4 h:mm:ss
FORMAT_DATE_TIME5 mm:ss
FORMAT_DATE_TIME6 h:mm:ss
FORMAT_DATE_TIME7 i:s.S
FORMAT_DATE_TIME8 h:mm:ss;@
FORMAT_DATE_YYYYMMDDSLASH yyyy/mm/dd;@
FORMAT_DATE_LONG_DATE dddd, mmmm d, yyyy

セルのフォントオブジェクトの取得

getFontメソッドを使用することで、セルのフォントオブジェクトを取得することができます。
フォントオブジェクトはフォントに関する操作を行うためのオブジェクトです。

$font = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont();

文字の書体を設定(変更)・取得

setNameメソッドを使用することで、文字の書体を設定(変更)することができます。

$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setName('MS Pゴシック');
引数 必須/任意 初期値 説明
第一引数 必須 string 'Calibri' 設定(変更)する書体名を指定します。

また、getNameメソッドを使用することで、設定中の書体名を取得することができます。

$fontName = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->getName();

文字の大きさを設定(変更)・取得

setSizeメソッドを使用することで、文字の大きさを設定(変更)することができます。

$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setSize(8);
引数 必須/任意 初期値 説明
第一引数 必須 int 設定(変更)する文字の大きさを指定します。

また、getSizeメソッドを使用することで、文字の大きさを取得することができます。

$size = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->getSize();

文字の太さを設定(変更)・取得

setBoldメソッドを使用することで、文字の太さを設定(変更)することができます。

$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
引数 必須/任意 初期値 説明
第一引数 必須 bool 太くする場合はtrue、太くしない場合はfalseを指定します。

また、getBoldメソッドを使用することで、太さが与えられているかそうでないかを取得します。

$isBold = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->getBold();

文字のイタリック体を設定(変更)・取得

setItalicメソッドを使用することで、文字のイタリック体を設定(変更)することができます。

$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setItalic(true);
引数 必須/任意 初期値 説明
第一引数 必須 bool イタリック体にする場合はtrue、イタリック体にしない場合はfalseを指定します。

また、getItalicメソッドを使用することで、イタリック体が与えられているかそうでないかを取得します。

$isBold = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->getItalic();

文字の下線を設定(変更)・取得

setUnderlineメソッドを使用することで、文字の下線を設定(変更)することができます。

$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setUnderline(true);
引数 必須/任意 初期値 説明
第一引数 必須 bool 下線を付ける場合はtrue、下線を付けない場合はfalseを指定します。また定数で下線の種類を指定することもできます。
定数 説明
Font::UNDERLINE_NONE 下線を付けません。
Font::UNDERLINE_SINGLE 下線を付けます。
Font::UNDERLINE_SINGLEACCOUNTING セル幅いっぱいに下線を付けます。
Font::UNDERLINE_DOUBLE 二重下線を付けます。
Font::UNDERLINE_DOUBLEACCOUNTING セル幅いっぱいに二重下線を付けます。

また、getUnderlineメソッドを使用することで、下線が与えられているかそうでないかを取得します。

$underLine = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->getUnderline();

色を定義

PhpOffice\PhpSpreadsheet\Style\Colorクラスを使用することで、色を定義します。
newキーワードでインスタンスを生成します。

use PhpOffice\PhpSpreadsheet\Style\Color;

$color = new Color();

色を設定

setRGBメソッドを使用すると16進数のRGBカラー、setARGBメソッドを使用すると16進数のRGBカラーに不透明度を含んだ色を設定できます。

引数 必須/任意 初期値 説明
第一引数 必須 string 設定する色を16進数で指定します。通常のRGBカラーは6桁(RRGGBB)、不透明度付きは8桁(AARRGGBB)で指定します。
// RGB
$color->setRGB('FF0000');

// ARGB
$color->setARGB('99FF0000');

色を取得

getRGBメソッドを使用すると16進数のRGBカラー、getARGBメソッドを使用すると16進数のRGBカラーに不透明度を含んだ色を取得することができます。

// RGB
$color = $color->getRGB();

// ARGB
$color = $color->getARGB();

文字に取り消し線を設定(変更)・取得

setStrikethroughメソッドを使用することで、文字に取り消し線を設定(変更)することができます。

$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setStrikethrough(true);
引数 必須/任意 初期値 説明
第一引数 必須 bool 取り消し線を付ける場合はtrue、取り消し線を付けない場合はfalseを指定します。

また、getStrikethroughメソッドを使用することで、取り消し線が与えられているかそうでないかを取得します。

$isStrike = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->getStrikethrough();

文字に色を設定(変更)・取得

setColorメソッドを使用することで、文字に色を設定(変更)することができます。

引数 必須/任意 初期値 説明
第一引数 必須 Color 付ける色をColorクラスのオブジェクトで指定します。
use PhpOffice\PhpSpreadsheet\Style\Color;

$color = new Color();

$color->setRGB('FF0000');

$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setColor($color);

また、getColorメソッドを使用することで、設定されている色を取得することができます。

$color = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->getColor();

文字の上下左右の位置揃えを設定(変更)・取得

setVerticalメソッドまたはsetHorizontalメソッドで、文字の上下左右の位置揃えを設定(変更)することができます。
setVerticalメソッドは垂直方向、setHorizontalメソッドは水平方向の位置を調整します。

引数 必須/任意 初期値 説明
第一引数 必須 string 揃える方向を指定します。また定数で指定することもできます。
定数 説明
Alignment::VERTICAL_TOP 上揃えにします。
Alignment::VERTICAL_CENTER 上下中央揃えにします。
Alignment::VERTICAL_BOTTOM 下揃えにします。
Alignment::VERTICAL_JUSTIFY 均等割付にします。
Alignment::VERTICAL_DISTRIBUTED 均等割付にします。Excel2007用です。
Alignment::HORIZONTAL_GENERAL 初期位置にします。
Alignment::HORIZONTAL_LEFT 左揃えにします。
Alignment::HORIZONTAL_RIGHT 右揃えにします。
Alignment::HORIZONTAL_CENTER 左右中央揃えにします。
Alignment::HORIZONTAL_CENTER_CONTINUOUS 選択範囲内で左右中央揃えにします。
Alignment::HORIZONTAL_JUSTIFY 均等割付にします。
Alignment::HORIZONTAL_FILL 不明
Alignment::HORIZONTAL_DISTRIBUTED 均等割付にします。Excel2007用です。
use PhpOffice\PhpSpreadsheet\Style\Alignment;

... 中略 ...

$alignment = $spreadsheet->getActiveSheet()->getStyle('A1')->getAlignment();

$alignment->setVertical(Alignment::VERTICAL_TOP);
$alignment->setHorizontal(Alignment::HORIZONTAL_CENTER);

また、getVerticalメソッドまたはgetHorizontalメソッドを使用することで、設定されている位置揃えを取得することができます。
getVerticalメソッドは垂直方向、getHorizontalメソッドは水平方向の位置です。

$vertical = $spreadsheet->getActiveSheet()->getStyle('A1')->getAlignment()->getVertical();

文字の折り返しの設定(変更)・取得

setWrapTextメソッドで、文字の折り返しの設定(変更)することができます。

引数 必須/任意 初期値 説明
第一引数 必須 bool 文字を折り返すかどうかを指定します。
$spreadsheet->getActiveSheet()->getStyle('A1')->getAlignment()->setWrapText(true);

また、getWrapTextメソッドを使用することで、折り返しの状態を取得することができます。

$isWrap = $spreadsheet->getActiveSheet()->getStyle('A1')->getAlignment()->getWrapText();

セルの塗り潰しオブジェクトの取得

getFillメソッドを使用することで、セルの塗り潰しオブジェクトを取得することができます。
塗り潰しオブジェクトは塗り潰しに関する操作を行うためのオブジェクトです。

$fill = $spreadsheet->getActiveSheet()->getStyle('A1')->getFill();

セルに塗り潰しを設定(変更)・取得

セルに塗り潰しを設定(変更)する場合、いくつかのメソッドを組み合わせます。

setFillTypeメソッドで塗り潰しパターンの種類を設定(変更)します。

引数 必須/任意 初期値 説明
第一引数 必須 string Fill::FILL_NONE パターンの種類を指定します。また定数で指定することもできます。
定数 イメージ
Fill::FILL_NONE
Fill::FILL_SOLID
Fill::FILL_GRADIENT_LINEAR
Fill::FILL_GRADIENT_PATH
Fill::FILL_PATTERN_DARKDOWN
Fill::FILL_PATTERN_DARKGRAY
Fill::FILL_PATTERN_DARKGRID
Fill::FILL_PATTERN_DARKHORIZONTAL
Fill::FILL_PATTERN_DARKTRELLIS
Fill::FILL_PATTERN_DARKUP
Fill::FILL_PATTERN_DARKVERTICAL
Fill::FILL_PATTERN_GRAY0625
Fill::FILL_PATTERN_GRAY125
Fill::FILL_PATTERN_LIGHTDOWN
Fill::FILL_PATTERN_LIGHTGRAY
Fill::FILL_PATTERN_LIGHTGRID
Fill::FILL_PATTERN_LIGHTHORIZONTAL
Fill::FILL_PATTERN_LIGHTTRELLIS
Fill::FILL_PATTERN_LIGHTUP
Fill::FILL_PATTERN_LIGHTVERTICAL
Fill::FILL_PATTERN_MEDIUMGRAY
use PhpOffice\PhpSpreadsheet\Style\Fill;

$spreadsheet->getActiveSheet()->getStyle('A1')->getFill()->setFillType(Fill::FILL_SOLID);

setStartColorメソッドまたはsetEndColorメソッドまたはで色を設定(変更)します。
単色であればsetStartColorメソッドのみ、グラデーションであれば両方のメソッドを使用します。

引数 必須/任意 初期値 説明
第一引数 必須 Color 付ける色をColorクラスのオブジェクトで指定します。
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Color;

... 中略 ...

$color = new Color();

$color->setRGB('FF0000');

$spreadsheet->getActiveSheet()->getStyle('A1')->getFill()->setFillType(Fill::FILL_SOLID)->setStartColor($color);

またgetStartColorメソッドまたはgetEndColorメソッドで、それぞれのColorクラスのインスタンスを取得することができます。

use PhpOffice\PhpSpreadsheet\Style\Fill;

... 中略 ...

$fill = $spreadsheet->getActiveSheet()->getStyle('A1')->getFill();

$fill->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('FF0000');

行やセルを繰り返す

getRowIteratorメソッドを使用することで、行を繰り返すことができます。
また、getCellIteratorメソッドを使用すると行からさらにセルを繰り返すことができます。

引数 必須/任意 初期値 説明
第一引数 任意 int 1 取得を開始する行番号を指定します。
第二引数 任意 int | null null 取得を終了する行番号を指定します。
foreach ($spreadsheet->getActiveSheet()->getRowIterator() as $row) {
  foreach ($row->getCellIterator() as $cell) {
    echo $cell->getValue()."\n";
  }
}

セルの罫線オブジェクトの取得

getBordersメソッドを使用することで、セルの罫線オブジェクトを取得することができます。
罫線オブジェクトは罫線に関する操作を行うためのオブジェクトです。

$borders = $spreadsheet->getActiveSheet()->getStyle('A1')->getBorders();

罫線を引く

罫線の方向

罫線を引くにはまず、対象となる罫線を取得します。

メソッド 位置 イメージ
getTop
getBottom
getLeft
getRight
getOutline 外周
getInside 内周
getVertical 垂直
getHorizontal 水平
getAllBorders すべて
$borderTop = $spreadsheet->getActiveSheet()->getStyle('A1')->getBorders()->getTop();

種類を指定して罫線を引く

setBorderStyleメソッドを使用することで、罫線を引くことができます。

引数 必須/任意 初期値 説明
第一引数 必須 string | bool 罫線の種類を指定します。また定数で指定することもできます。なお、trueを指定するとBorder::BORDER_MEDIUMで罫線を引きます。
定数 イメージ
Border::BORDER_NONE
Border::BORDER_DASHDOT
Border::BORDER_DASHDOTDOT
Border::BORDER_DASHED
Border::BORDER_DOTTED
Border::BORDER_DOUBLE
Border::BORDER_HAIR
Border::BORDER_MEDIUM
Border::BORDER_MEDIUMDASHDOT
Border::BORDER_MEDIUMDASHDOTDOT
Border::BORDER_MEDIUMDASHED
Border::BORDER_SLANTDASHDOT
Border::BORDER_THICK
Border::BORDER_THIN
Border::BORDER_OMIT
use PhpOffice\PhpSpreadsheet\Style\Border;

... 中略 ...

$spreadsheet->getActiveSheet()->getStyle('A1')->getBorders()->getTop()->setBorderStyle('medium');

// 定数
$spreadsheet->getActiveSheet()->getStyle('A1')->getBorders()->getTop()->setBorderStyle(Border::BORDER_MEDIUM);

罫線の色を設定

setColorメソッドで罫線の色を設定(変更)することができます。

引数 必須/任意 初期値 説明
第一引数 必須 Color 付ける色をColorクラスのオブジェクトで指定します。
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;

... 中略 ...

$color = new Color();

$color->setRGB('FF0000');

$borderTop = $spreadsheet->getActiveSheet()->getStyle('A1')->getBorders()->getTop();

$borderTop->setBorderStyle(Border::BORDER_MEDIUM);
$borderTop->setColor($color);

またgetColorメソッドで、Colorクラスのインスタンスを取得することができます。

use PhpOffice\PhpSpreadsheet\Style\Border;

... 中略 ...

$borderTop = $spreadsheet->getActiveSheet()->getStyle('A1')->getBorders()->getTop();

$borderTop->setBorderStyle(Border::BORDER_MEDIUM);
$borderTop->getColor()->setRGB('FF0000');

セルのコメントを設定・取得

getCommentメソッドを使用することで、セルのコメントを操作するためのオブジェクトを取得します。

引数 必須/任意 初期値 説明
第一引数 必須 string 対象セルの番号を指定します。
$comment = $spreadsheet->getActiveSheet()->getComment('A1');

コメントのテキストを設定・取得

getText()->createTextRunメソッドを使用すると、コメントのテキストを設定することができます。

$spreadsheet->getActiveSheet()->getComment('A1')->getText()->createTextRun("Hello World\nHello World");

またgetText()->getPlainTextメソッドを使用すると、設定されているコメントのテキストを取得することができます。

echo $spreadsheet->getActiveSheet()->getComment('A1')->getText()->getPlainText();

コメントを表示

setVisibleメソッドを使用すると、コメントを表示することができます。

引数 必須/任意 初期値 説明
第一引数 必須 bool 表示する場合はtrue、表示しない場合はfalseを指定します。
echo $spreadsheet->getActiveSheet()->getComment('A1')->setVisible(true);

コメントの幅・高さを設定

setWidthメソッドまたはsetheightメソッドを使用すると、コメントの幅や高さを設定することができます。
setWidthメソッドは幅、setheightメソッドは高さを設定します。

引数 必須/任意 初期値 説明
第一引数 必須 string 設定する値を指定します。
echo $spreadsheet->getActiveSheet()->getComment('A1')->setWidth('240px')->setheight('160px');

画像を貼り付け

Drawingクラスを使用することで、画像を扱うことができます。

use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

$drawing = new Drawing();

ドキュメント:https://phpspreadsheet.readthedocs.io/en/latest/topics/recipes/#add-a-drawing-to-a-worksheet

画像の読み込み

setPathメソッドを使用することで、ローカルやネットワーク上の画像を読み込むことができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 画像のパスを指定します。ネットワーク上の場合はhttpから始まるURLを指定することで、読み込むことができます。
$drawing = new Drawing();
$drawing->setPath('source/image.jpg');

画像の幅や高さを設定

setWidthメソッドまたはsetHeightメソッドを使用することで、表示する画像の幅や高さを設定することができます。
setWidthメソッドは幅、setHeightメソッドは高さを設定します。

引数 必須/任意 初期値 説明
第一引数 必須 int 設定する値を指定します。単位なしのピクセル値で指定します。
$drawing = new Drawing();
$drawing->setPath('img/sample.jpg');
$drawing->setWidth(240);
$drawing->setHeight(160);

ワークシートへ表示

setWorksheetメソッドを使用することで、ワークシートへ表示させることができます。

引数 必須/任意 初期値 説明
第一引数 必須 Worksheet 画像を表示したいワークシートを指定します。
$drawing = new Drawing();
$drawing->setPath('img/sample.jpg');
$drawing->setWorksheet($spreadsheet->getActiveSheet());

セルへの表示位置の設定

setCoordinatesメソッドを使用することで、画像のセルへの表示位置を設定させることができます。
このメソッドを使用しない場合、初期で「A1」へ画像が表示されます。

引数 必須/任意 初期値 説明
第一引数 必須 string 表示したいセルの番号を指定します。
$drawing = new Drawing();
$drawing->setPath('img/sample.jpg');
$drawing->setCoordinates('C5');
$drawing->setWorksheet($spreadsheet->getActiveSheet());

表示位置の調整

setOffsetXメソッドまたはsetOffsetYメソッドを使用することで、画像の表示位置を調整することができます。
setOffsetXメソッドは水平方向、setOffsetYメソッドは垂直方向の調整を行います。
現在の位置から相対値で位置が調整されます。

引数 必須/任意 初期値 説明
第一引数 必須 int 調整する値を指定します。単位なしのピクセル値で指定します。
$drawing = new Drawing();
$drawing->setPath('img/sample.jpg');
$drawing->setOffsetX(5);
$drawing->setOffsetY(10);
$drawing->setWorksheet($spreadsheet->getActiveSheet());

回転

setRotationメソッドを使用することで、画像を回転させることができます。

引数 必須/任意 初期値 説明
第一引数 必須 int 回転する角度を単位無しで指定します。
$drawing = new Drawing();
$drawing->setPath('img/sample.jpg');
$drawing->setRotation(25); // 25度時計回りに回転
$drawing->setWorksheet($spreadsheet->getActiveSheet());

プロパティの設定

setNameメソッドまたはsetDescriptionメソッドを使用することで、各プロパティを設定することができます。
setNameメソッドはタイトル、setDescriptionメソッドは説明を設定します。

$drawing = new Drawing();
$drawing->setPath('img/sample.jpg');
$drawing->setName('Test');
$drawing->setDescription('Hello World.');
$drawing->setWorksheet($spreadsheet->getActiveSheet());

行と列を固定

freezePaneメソッドを使用すると、行または列を固定して表示することができます。
スクロールしても対象の行または列は常に表示された状態になります。

引数 必須/任意 初期値 説明
第一引数 必須 string 固定を開始するセルの番号を指定します。指定したセルの左上を基準に固定されます。
第一引数 任意 string null 第一引数で固定された位置から表示を開始するセルの番号を指定します。
// B2の左上を固定
$spreadsheet->getActiveSheet()->freezePane('B2');

// B2の左上を固定しつつD4を固定位置に表示
$spreadsheet->getActiveSheet()->freezePane('B2', 'D4');

オートフィルターの設定

setAutoFilterメソッドを使用すると、オートフィルターを設定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string オートフィルターを設定するセルの範囲を指定します。
$worksheet = $spreadsheet->getActiveSheet();

// A1からD10まで
$worksheet->setAutoFilter('A1:D10');

// A列からD列まで
$worksheet->setAutoFilter('A:D');

// データが入っている全セル
$worksheet->setAutoFilter($worksheet->calculateWorksheetDimension());

ドキュメント:https://phpspreadsheet.readthedocs.io/en/latest/topics/autofilters/

プロパティの設定・取得

getPropertiesメソッドでプロパティの操作を行うためのオブジェクトを取得します。

$props = $spreadsheet->getProperties();

各プロパティの設定

各プロパティはそれぞれのメソッドで設定することができます。

メソッド 説明
setCreator 作成者
setLastModifiedBy 更新者
setTitle タイトル
setSubject 件名
setDescription 説明文章
setKeywords キーワード
setCategory カテゴリー
setCreated 作成日
setModified 更新日
$props = $spreadsheet->getProperties();

$props->setCreator('山田太郎');
$props->setLastModifiedBy('山田太郎');
$props->setTitle('タイトル');
$props->setSubject('件名');
$props->setDescription('説明');
$props->setKeywords('キーワード');
$props->setCategory('カテゴリー');
$props->setCreated(mktime(1, 12, 23, 1, 2, 2000));
$props->setModified(mktime(1, 12, 23, 1, 2, 2000));

各プロパティの取得

各プロパティはそれぞれのメソッドで取得することができます。

メソッド 説明
getCreator 作成者
getLastModifiedBy 更新者
getTitle タイトル
getSubject 件名
getDescription 説明文章
getKeywords キーワード
getCategory カテゴリー
getCreated 作成日
getModified 更新日
$props = $spreadsheet->getProperties();

echo $props->getCreator();
echo $props->getLastModifiedBy();
echo $props->getTitle();
echo $props->getSubject();
echo $props->getDescription();
echo $props->getKeywords();
echo $props->getCategory();
echo $props->getCreated();
echo $props->getModified();

シートの保護

getProtectionメソッドでシートの保護の操作を行うためのオブジェクトを取得します。

$protection = $spreadsheet->getActiveSheet()->getProtection();

シートを保護・解除

setSheetメソッドを使用することで、シートを保護したり解除したりすることができます。

引数 必須/任意 初期値 説明
第一引数 必須 bool シートを保護するかどうかを指定します。trueで保護、falseで解除します。
$spreadsheet->getActiveSheet()->getProtection()->setSheet(true);

シートをパスワード付きで保護・解除

setPasswordメソッドを使用することで、パスワード付きで保護したり解除することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 設定または解除するパスワードを指定します。
$spreadsheet->getActiveSheet()->getProtection()->setSheet(true)->setPassword('1234');

セルの保護

セルの保護は少し特殊で、シート全体を保護して、特定のセルのみ保護を解除するという方法です。
getStyleメソッドでセルの範囲を取得し、getProtectionメソッドで保護操作用オブジェクトを取得、setLockedメソッドで解除します。

use PhpOffice\PhpSpreadsheet\Style\Protection;

... 中略 ...

// シートを保護
$spreadsheet->getActiveSheet()->getProtection()->setSheet(true);

// 特定のセルの保護を解除
$spreadsheet->getActiveSheet()->getStyle('A1:B2')->getProtection()->setLocked(Protection::PROTECTION_UNPROTECTED);
定数 説明
Protection::PROTECTION_PROTECTED 保護
Protection::PROTECTION_UNPROTECTED 保護を解除

列(カラム)の幅を設定または取得

setWidthメソッドを使用することで、列(カラム)の幅を設定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 int 幅を指定します。
第二引数 任意 string | null null 第一引数の単位を指定します。
$worksheet->getColumnDimension('A')->setWidth(200);
$worksheet->getColumnDimension('A')->setWidth(200, 'px'); // 単位あり

また、getWidthメソッドを使用することで、列(カラム)の幅を取得することができます。

$width = $worksheet->getColumnDimension('A')->getWidth();

行の高さを設定または取得

setRowHeightメソッドを使用することで、行の高さを設定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 int 高さを指定します。
第二引数 任意 string | null null 第一引数の単位を指定します。
$worksheet->getRowDimension(1)->setRowHeight(30);
$worksheet->getRowDimension(1)->setRowHeight(30, 'px'); // 単位あり

また、getRowHeightメソッドを使用することで、行の高さを取得することができます。

$height = $worksheet->getRowDimension(1)->getRowHeight(30, 'px');

別のワークシートを挿入

addExternalSheetメソッドを使用することで、別のワークシートを挿入することができます。

引数 必須/任意 初期値 説明
第一引数 必須 Worksheet 挿入するワークシートを指定します。
第一引数 任意 int null 挿入先のワークシートの位置をインデックス番号で指定します。省略した場合は末尾に挿入します。
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;

$spreadsheet1 = (new Reader())->load('foo.xlsx');
$spreadsheet2 = (new Reader())->load('bar.xlsx');

$spreadsheet1->addExternalSheet($spreadsheet2->getActiveSheet());

【応用】ファイルとしてダウンロード

saveメソッドにphp://outputを指定することで、その場で出力することができます。
header関数とあわせることで、その場でダウンロードさせることができます。

require('vendor/autoload.php');

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;

$reader = new Reader();
$spreadsheet = $reader->load('sample.xlsx');

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="sample-dl.xlsx"');
header('Cache-Control: max-age=0');

$writer = new Writer($spreadsheet);
$writer->save('php://output');

メモリ不足になった場合

disconnectWorksheetsメソッドまたはdisconnectCellsメソッドでメモリを解放することができます。
disconnectWorksheetsメソッドはシート全体、disconnectCellsメソッドは対象のシートのメモリを解放します。

// シート全体
$spreadsheet->disconnectWorksheets();

// 特定のシート
$spreadsheet->getActiveSheet()->disconnectCells();

Discussion