案件でEXCELによる帳票出力をやりそうだったので、PhpSpreadsheetを試してみる
インストール
composerでインストール。2017/09/08現在は1.0.0のbetaが出ているようなので、1.0.0-betaを入れる。
composer require phpoffice/phpspreadsheet:1.0.0-beta
Hello World の出力
まず、ドキュメントの通りHelloWorldを出力してみる。
require_once '../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('hello world.xlsx');
実行したPHPと同じフォルダにhello world.xlsx
が出力され、セルのA1にHello World !
が出力されている。
自分のPCにEXCELが無いので、Numbersですが。。。
出力されたファイル
テンプレートを読み込んで出力
EXCELでテンプレートを作成し、それを読み込んで出力する。
Numbersでxlsxで出力して読み込んでみたが、出力されるEXCELのレイアウトがかなり崩れて出力されたため、別端末に入ってるEXCELでテンプレートを作成して読み込み。
読み込むテンプレート
require_once '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('./template/profile.xlsx');
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('C2', '山田太郎');
$sheet->setCellValue('C3', '1999年1月30日');
// セル内の改行
$sheet->setCellValue('C4', "備考1\n備考2");
$writer = new Xlsx($spreadsheet);
$writer->save('write.xlsx');
出力されたファイル
セルの結合
セルを結合する。セルの名前で指定して結合するパターンと、行列番号を指定してマージするパターン。行列番号を指定する場合は、列Aは0になる。
require_once '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// セル名によるセルのマージ
$sheet->mergeCells('A2:B3');
$sheet->setCellValue('A2', 'Merge(Cell Name) !');
// 行列番号指定(下記の場合、C4 から D6のセルを結合)
$sheet->mergeCellsByColumnAndRow(2, 4, 3, 6);
$sheet->setCellValue('C4', 'Merge(Cell Number) !');
$writer = new Xlsx($spreadsheet);
$writer->save('merge.xlsx');
出力されたファイル
セルのスタイル設定
セルの罫線やフォントの変更。
require_once '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('B2', 'Font');
$styleArray = [
'borders' => [
'outline' => [
// 線のスタイル
'style' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHED,
// 線の色
'color' => ['argb' => 'FFFF0000'],
],
],
'font' => [
// フォント
'name' => 'ヒラギノ丸ゴ Pro',
// フォントサイズ
'size' => '8',
],
];
$sheet->getStyle('B2')->applyFromArray($styleArray);
$writer = new Xlsx($spreadsheet);
$writer->save('style.xlsx');
出力されたファイル
線の種類
線の種類はいくつかパターンがあるが、Numbersだとうまく表示されないので、EXCELで確認。以下、線の種類とサンプル。表現が難しい。。。
設定できる値
定数 | スタイル |
---|---|
BORDER_NONE | 線なし |
BORDER_DASHDOT | 点線(1点1線) |
BORDER_DASHDOTDOT | 点線(2点1線) |
BORDER_DASHED | 点線(長い) |
BORDER_DOTTED | 点線 |
BORDER_DOUBLE | 二重線 |
BORDER_HAIR | 細線 |
BORDER_MEDIUM | 太線 |
BORDER_MEDIUMDASHDOT | 太め点線(1点1線) |
BORDER_MEDIUMDASHDOTDOT | 太め点線(2点1線) |
BORDER_MEDIUMDASHED | 太め点線(長い) |
BORDER_SLANTDASHDOT | 斜め線 |
BORDER_THICK | MEDIUMより太線 |
BORDER_THIN | 通常線 |
サンプル
罫線を引く位置の設定
例えば、左だけに線を設定したい場合などは、上記ソースを下記のように修正すれば良い。
require_once '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('B2', 'Font');
$styleArray = [
'borders' => [
- 'outline' => [
+ 'left' => [
// 線のスタイル
'style' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHED,
// 線の色
'color' => ['argb' => 'FFFF0000'],
],
],
'font' => [
// フォント
'name' => 'ヒラギノ丸ゴ Pro',
// フォントサイズ
'size' => '8',
],
];
$sheet->getStyle('B2')->applyFromArray($styleArray);
$writer = new Xlsx($spreadsheet);
$writer->save('style.xlsx');
設定できる値
値 | スタイル |
---|---|
left | |
right | 右のみ |
top | 上のみ |
bottom | 下のみ |
diagonal | 斜め線 |
allborders | 全て |
outline | 外枠のみ |
inside | 内側のみ |
vertical | 縦線のみ |
horizontal | 横線のみ |
サンプル
CSVでの出力
シートを指定してCSVで出力する
require_once '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$data = [
['名前', '生年月日'],
['氏名1', '1999年1月1日'],
['氏名2', '1999年2月1日'],
['氏名3', '1999年3月1日'],
['氏名4', '1999年4月1日'],
['氏名5', '1999年5月1日'],
];
// A1から$dataを貼り付け
$sheet->fromArray($data, null, 'A1');
$writer = new Csv($spreadsheet);
// 区切り文字
$writer->setDelimiter(',');
// 囲み文字
$writer->setEnclosure('"');
// 改行コード
$writer->setLineEnding("\r\n");
// CSVを出力するシート
$writer->setSheetIndex(0);
$writer->save('csv_out.csv');
出力されたファイル
文字コードの指定ができない。。。
今回は、ここまでで。
まだ、行コピーとかファイルのプロパティ設定とかありそうなので、
新たに試したりしたら、追記をしたいと思います。
参考サイト