PhpSpreadsheetを試してみる(テンプレート読み込み・セルの結合・スタイル設定・CSV出力)


案件でEXCELによる帳票出力をやりそうだったので、[PhpSpreadsheet](https://github.com/PHPOffice/PhpSpreadsheet)を試してみる

## インストール

composerでインストール。2017/09/08現在は1.0.0のbetaが出ているようなので、1.0.0-betaを入れる。

```
composer require phpoffice/phpspreadsheet:1.0.0-beta
```

## Hello World の出力

まず、[ドキュメント](http://phpspreadsheet.readthedocs.io/en/develop/)の通りHelloWorldを出力してみる。

```php
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ですが。。。

### 出力されたファイル

![48ffadd6a9bd52f701a8ccb7e6d24ecb.png](https://qiita-image-store.s3.amazonaws.com/0/27566/fa82da7b-7862-d54a-9430-1c74c68f21f1.png "48ffadd6a9bd52f701a8ccb7e6d24ecb.png")

## テンプレートを読み込んで出力

EXCELでテンプレートを作成し、それを読み込んで出力する。
Numbersでxlsxで出力して読み込んでみたが、出力されるEXCELのレイアウトがかなり崩れて出力されたため、別端末に入ってるEXCELでテンプレートを作成して読み込み。

### 読み込むテンプレート
![1a62127f7af1da1abb08fa975f8ff5bb.png](https://qiita-image-store.s3.amazonaws.com/0/27566/fb51ee08-2b1a-d085-255b-5c515a21d8dc.png "1a62127f7af1da1abb08fa975f8ff5bb.png")

```php
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');


```

### 出力されたファイル

![54995587b4ea168aa8c415aa90b3b509.png](https://qiita-image-store.s3.amazonaws.com/0/27566/b5571c43-c20e-44b1-042e-84d9865d4edd.png "54995587b4ea168aa8c415aa90b3b509.png")

## セルの結合

セルを結合する。セルの名前で指定して結合するパターンと、行列番号を指定してマージするパターン。行列番号を指定する場合は、列Aは0になる。

```php
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');
```

### 出力されたファイル

![2383c937aa2a46d88c1634c838c05b2f.png](https://qiita-image-store.s3.amazonaws.com/0/27566/f3e7b614-c24b-b425-eb06-a7de3742c5ac.png "2383c937aa2a46d88c1634c838c05b2f.png")

## セルのスタイル設定

セルの罫線やフォントの変更。

```php
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');
```

### 出力されたファイル
![fc25ee7632affa5232a8efbe4c859bbc.png](https://qiita-image-store.s3.amazonaws.com/0/27566/1f0f8367-2f2a-776f-871a-3be9bc847074.png "fc25ee7632affa5232a8efbe4c859bbc.png")

### 線の種類

線の種類はいくつかパターンがあるが、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|通常線|

#### サンプル

![5df4a992a324f57054eacaca8f1a3e88.png](https://qiita-image-store.s3.amazonaws.com/0/27566/7ea773c4-4f5f-d4cf-128c-eb7f4bdc927c.png "5df4a992a324f57054eacaca8f1a3e88.png")

#### 罫線を引く位置の設定

例えば、左だけに線を設定したい場合などは、上記ソースを下記のように修正すれば良い。

```diff
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|横線のみ|

#### サンプル

![2548108fb01e66c7a7f542d5467f7f35.png](https://qiita-image-store.s3.amazonaws.com/0/27566/9cb58b7c-f720-8460-042e-02edb3fef04e.png "2548108fb01e66c7a7f542d5467f7f35.png")

## CSVでの出力

シートを指定してCSVで出力する

```php
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');
```

### 出力されたファイル

![ef9c677f343d9733d9482347ba3cd325.png](https://qiita-image-store.s3.amazonaws.com/0/27566/963bd96b-63dc-ba96-14f3-e55f8032ead8.png "ef9c677f343d9733d9482347ba3cd325.png")

文字コードの指定ができない。。。

***

今回は、ここまでで。
まだ、行コピーとかファイルのプロパティ設定とかありそうなので、
新たに試したりしたら、追記をしたいと思います。

***
参考サイト

* [PhpSpreadsheet's documentation](https://phpspreadsheet.readthedocs.io/en/develop/)