少し前まではPHPでExcelファイルを操作するのは「PHPExcel」が主流でしたが、2017年に非推奨となってからは後継の「PhpSpreadsheet」がメインで使われています。
そこで、PhpSpreadsheetでExcelファイルを作成する方法についてみていきます。
PhpSpreadsheetとは?
PhpSpreadsheetは、Excelの新規ファイルを作成したり、既存のファイルを読み書きすることが可能な、無償のPHPライブラリです。一般公開向けのサイトよりも、社内での管理システムなどExcelの使用が保証されている環境でのシステムで利用されることが多いです。
PhpSpreadsheetのインストールと設定
まず、composerでPhpSpreadsheetをインストールします。
composer require phpoffice/phpspreadsheet
続いて、PhpSpreadsheetを読み込みます。DOCUMENT_ROOTからのパスについては、それぞれの環境に合わせて適宜通しておいてください。
require_once 'vendor/autoload.php';
名前空間のエイリアスを指定して、PhpSpreadsheet を使用する準備をします。
use PhpOffice\PhpSpreadsheet\Spreadsheet; // スプレッドシート用
use PhpOffice\PhpSpreadsheet\Reader\Xls as XlsReader; // 拡張子xlsのExcelファイル読み込み用
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader; // 拡張子xlsxのExcelファイル読み込み用
use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // 拡張子xlsxのExcelファイル書き込み用
use PhpOffice\PhpSpreadsheet\Style\NumberFormat; // 日付形式
use PhpOffice\PhpSpreadsheet\Style\Border; // 罫線用
use PhpOffice\PhpSpreadsheet\Style\Alignment; // 出力位置指定用
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; // ワークシート用
Excelファイルの作成
PhpSpreadsheetを使ったExcelファイル作成のサンプルは、こちらです。
Excelファイルを作成するおおまか手順は次のとおりです。よく使われる部分のみ抜粋します。
スプレッドシートを生成
$spreadsheet = new Spreadsheet();
ファイルのプロパティを設定
$spreadsheet->getProperties()->setTitle('PhpSpreadsheetのテスト');
新規シートの作成
$spreadsheet->createSheet(0);
ただし、保存の際に「xlsx」を指定した場合には最初からシートが1つ作成されていて2つになるので、createSheetではなく「getSheet」を使います。
$spreadsheet->getSheet(0);
シートの先頭にセルを合わせる。
$sheet = $spreadsheet->getActiveSheet()->unFreezePane();
シートに名前をつける
$sheet->setTitle('サンプル');
セルに文字・値を入れる
$sheet->setCellValue('A2','No.');
文字の水平方向の左寄せ・中央寄せ・右寄せ
$sheet->getStyle( 'A2' )->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT); // 左寄せ
$sheet->getStyle( 'A3' )->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); // 中央寄せ
$sheet->getStyle( 'A4' )->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT); // 右寄せ
文字を垂直方向の上寄せ・中央寄せ・下寄せ
$sheet->getStyle('B2')->getAlignment()->setVertical(Alignment::VERTICAL_TOP); // 上寄せ
$sheet->getStyle('B3')->getAlignment()->setVertical(Alignment::VERTICAL_CENTER); // 中央寄せ
$sheet->getStyle('B4')->getAlignment()->setVertical(Alignment::VERTICAL_BOTTOM); // 下寄せ
枠線を設定する
$sheet->getStyle('B2')->getBorders()->getOutline()->setBorderStyle(Border::BORDER_THIN);
セルの結合
$sheet->mergeCells('C1:D1');
セルの色を赤にする
$sheet->getStyle('C1')->getFont()->getColor()->setARGB('FFFF0000');
セル内の改行を有効にする
$sheet->getStyle('H1')->getAlignment()->setWrapText(true);
カラムの幅を設定する
$sheet->getColumnDimension( 'A' )->setWidth( 10.5 );
行の高さを指定する
$sheet->getRowDimension( 1 )->setRowHeight( 18.0 );
用紙のサイズと向きを設定する
$sheet->getPageSetup()->setPaperSize(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::PAPERSIZE_A4); // A4サイズ
$sheet->getPageSetup()->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE); // 横向き
$sheet->getPageSetup()->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_PORTRAIT); // 縦向き
余白の設定
$sheet->getPageMargins()->setTop(1.0);
$sheet->getPageMargins()->setBottom(1.0);
$sheet->getPageMargins()->setLeft(1.0);
$sheet->getPageMargins()->setRight(1.0);
$sheet->getPageMargins()->setHeader(1.0);
$sheet->getPageMargins()->setFooter(1.0);
作成したファイルのダウンロード
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="PhpSpreadsheetの作成テスト.xlsx"');
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;
なお、サンプルで使ったデータの配列は以下のとおりです。
$deta_list = array(
'0' => array(
'number' => 1,
'name' => '善如寺 輝仁',
'English' => 84,
'mathematics' => 64,
'National_language' => 72,
'science' => 98,
'social_studies' => 55,
'memo' => ''
),
'1' => array(
'number' => 2,
'name' => '橘高 弘英',
'English' => 74,
'mathematics' => 99,
'National_language' => 35,
'science' => 82,
'social_studies' => 66,
'memo' => '国語の補習'
),
'2' => array(
'number' => 3,
'name' => '神羽 増雄',
'English' => 54,
'mathematics' => 90,
'National_language' => 71,
'science' => 69,
'social_studies' => 80,
'memo' => ''
),
'3' => array(
'number' => 4,
'name' => '明正 邦寿',
'English' => 72,
'mathematics' => 60,
'National_language' => 77,
'science' => 38,
'social_studies' => 58,
'memo' => '理科の補習'
),
'4' => array(
'number' => 5,
'name' => '儀賀 則彰',
'English' => 80,
'mathematics' => 78,
'National_language' => 69,
'science' => 72,
'social_studies' => 74,
'memo' => ''
),
'5' => array(
'number' => 6,
'name' => '小数賀 将輝',
'English' => 88,
'mathematics' => 42,
'National_language' => 78,
'science' => 69,
'social_studies' => 73,
'memo' => ''
),
'6' => array(
'number' => 7,
'name' => '駒野谷 杏名',
'English' => 36,
'mathematics' => 100,
'National_language' => 82,
'science' => 64,
'social_studies' => 80,
'memo' => '英語の補習'
),
'7' => array(
'number' => 8,
'name' => '武関 英姫',
'English' => 96,
'mathematics' => 74,
'National_language' => 70,
'science' => 99,
'social_studies' => 25,
'memo' => '社会の補習'
),
'8' => array(
'number' => 9,
'name' => '中蔵 ふく子',
'English' => 60,
'mathematics' => 62,
'National_language' => 39,
'science' => 78,
'social_studies' => 54,
'memo' => '国語の補習'
),
'9' => array(
'number' => 10,
'name' => '木船 磨希',
'English' => 66,
'mathematics' => 55,
'National_language' => 100,
'science' => 45,
'social_studies' => 38,
'memo' => '社会の補習'
)
);