PHPExcelの後継、PhpSpreadsheetを使ってみた
一昔前はPHPでExcel操作をする時は 「PHPExcel」 が主流でしたが
開発終了と共に後継の 「PhpSpreadsheet」 が出ています。
今回はその PhpSpreadsheet を使用してみようと思います。
◆PhpSpreadsheetに関するリンク
環境
実行環境はこんな感じです。
CentOS 7
PHP Version 7.1.11
Composer
※Composerのインストールおよび使い方の説明は割愛します
※Linuxの使い方の説明は割愛します
実装方法
インストール
まずは composer で PhpSpreadsheet をインストールします
1 2 3 |
$ composer require phpoffice/phpspreadsheet |
続いて PhpSpreadsheet を使用できるようにします
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require 'vendor/autoload.php'; // Spreadsheet use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Reader\Xls as XlsReader; use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Style\NumberFormat; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; |
これで PhpSpreadsheet を使用する準備ができました。
Excelを書き出す
Excelを書き出すには下記のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
// スプレッドシートを作成 $spreadsheet = new Spreadsheet(); // ファイルのプロパティを設定 $spreadsheet->getProperties() ->setTitle("タイトル"); // シート作成 $spreadsheet->getActiveSheet('sheet1')->UnFreezePane(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setTitle("シートタイトル"); // 値を設定 $sheet->setCellValue('A1', 'Hello'); $sheet->setCellValue('B1', 'PhpSpreadsheet'); $sheet->setCellValue('C1', 'World'); // テキストの中央寄せ $sheet->getStyle('A1:B1')->applyFromArray(['alignment'=>['horizontal'=>Alignment::HORIZONTAL_CENTER]]); // 枠線を設定 $sheet->getStyle('B1')->getBorders()->getOutline()->setBorderStyle(Border::BORDER_THIN); // 列の横幅を設定 $sheet->getColumnDimension('B')->setWidth(8); // セルを連結 $sheet->mergeCells('C1:D1'); // テキストの縦寄せ $sheet->getStyle('C1:D1')->getAlignment()->setVertical(Alignment::VERTICAL_TOP); // テキストの折り返しを設定 $sheet->getStyle('C1')->getAlignment()->setWrapText(true); // 配列の形で値を設定 $dataList = [ ['Happy Bingo!'], ['B', 'I', 'N', 'G', 'O'], [26, 15, 18, 17, 13], ['6', '11', 2, 5, '14'], [1, 8, NULL, 4, 19], [21, 27, 3, 20, 24], [16, 22, 23, 25, 12], ]; $sheet->fromArray($dataList, NULL, 'C6', true); // バッファをクリア ob_end_clean(); $fileName = "sample.xlsx"; // ダウンロード header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'.$fileName.'"'); header('Cache-Control: max-age=0'); header('Cache-Control: max-age=1'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: cache, must-revalidate'); header('Pragma: public'); $writer = new Xlsx($spreadsheet); $writer->save('php://output'); exit(); |
これでブラウザからアクセスすると、エクセルがダウンロードできると思います。
セルを数値で指定する
通常、セルの場所を指定するには 「A1」「G19」 など、列と行の組み合わせで指定します。
しかし、プログラムのループで出力する場合、英字を扱いたくない場合などもあると思います。
そんな時は下記のような命令が使用できます。
1 2 3 4 5 6 7 |
// セルを縦横の数値で指定する(列番号, 行番号, 値) $sheet->setCellValueByColumnAndRow(5, 3, '数値でセルを指定'); // セルのスタイルを縦横の数値で指定する $sheet->getStyleByColumnAndRow(5, 3)->getBorders()->getOutline()->setBorderStyle(Border::BORDER_THIN); |
注意するところは、列・行は 1 から指定するところでしょうか。
Excelを読み込む
アップロードされたり、サーバーにあるExcelファイルを読み込むには下記のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Excelファイルを指定 $filePath = "reader.xlsx"; // Excelファイルを読み込む $reader = new XlsReader(); // $reader = new Reader(); $spreadsheet = $reader->load($filePath); // シート取得 $sheet = $spreadsheet->getActiveSheet(); // 値を取得 $cellValue = $sheet->getCell("A1")->getCalculatedValue(); // $cellValue = $sheet->getCell("A1")->getValue(); // $cellValue = $sheet->getCell("A1")->getOldCalculatedValue(); // セルを操作する処理は省略 |
注意点は2つです。
1つは 「Xlsx と Xls でReaderが異なる」 こと (6 – 7行目)
これに関してはファイルの種類から判定すると良いと思います。
2つは 「値の取得方法が複数あり、それぞれ結果が異なる」 こと (14 – 16行目)
これはどういうことかというと 「値をそのまま取得する」 か 「値の計算結果を取得する」 の違いです。
細かな違いについては公式APIに記載されていますのでそちらを参照してください。
PhpOffice\PhpSpreadsheet\Cell\Cell:getValue()
PhpOffice\PhpSpreadsheet\Cell\Cell:getCalculatedValue()
PhpOffice\PhpSpreadsheet\Cell\Cell:getOldCalculatedValue()
Composerが使えない・使わない場合
もし環境によりComposerが使えない場合やWindowsで使用する場合など、別の方法でインストールしたい時は 「Composerが使えない環境でComposer用のライブラリを使う方法」 をご参照ください。
PhpSpreadsheetを例に挙げた、Composerを使わずに使用する方法を記載しています。
さいごに
今回説明したのは基本的な操作になります。
使ってみた感想としては、PHPExcelとほとんど同じように使えるので導入コストは低いかも?という感じです。
もっと詳しく操作したい場合は、公式のAPIリファレンスを参照してください。
- おすすめ記事
POPULAR
のえる
Full-stack Developer