phpspreadsheetで使ったメソッド

一部CakePHPのコードが混ざっています。
適宜変換してください。

- 雛形ファイルからインスタンス化して出力するまで

~~~php
<?php
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use Cake\Http\CallbackStream;

class PhpspreadsheetTest {
    public funciton test() 
        $reader = new XlsxReader();
        $filepath = "/test/test.xlsx";
        $spreadsheet = $reader->load($filepath);

        // ここにシートに書き込む処理を書く

        $writer = new XlsxWriter($spreadsheet);

        // ダウンロードさせないときはこう書く
        // /test/wirterというフォルダにtest.xlsxというファイルが作られる
        $writer->save('/test/writer/test.xlsx');

        // ダウンロードさせたいときはこう書く
        $stream = new CallbackStream(function () use ($writer) {
            $writer->save('php://output');
        });
        return $this->response->withType('xlsx')
            ->withHeader('Content-Disposition', "attachment;filename=\"test.xlsx\"")
            ->withBody($stream);
    }
}
~~~

- フォント設定
~~~php
$sheet = $spreadsheet->getDefaultStyle()->getFont()
    ->setName('ＭＳ　ゴシック');
~~~

- シートを取得
~~~php
// 現在開いているシート
$sheet = $spreadsheet->getActiveSheet();
// 最初のシート
$sheet = $spreadsheet->getSheet(0);
~~~

- シートタイトルの設定
~~~php
$sheet->setTitle('シートの名前');
~~~

- 値の設定(一括)
~~~php
$data = [
    ['A1に入る値', 'B1に入る値', 'C1に入る値'],
    ['A2に入る値', 'B2に入る値', 'C2に入る値'],
];
$sheet->fromArray($data, null, 'A2', true);
~~~

- 値の設定(個別)
~~~php
$sheet->setCellValue('A1', 'A1に入る値');

// 配列に入れてforeachで設定してもいいかもしれないです
$array = ['A1' => 'A1に入る値', 'A2' => 'A2に入る値'];
foreach ($array as $cell => $value) {
    $sheet->setCellValue($cell, $value);
}
~~~

- シートの最大列と最大行の取得
~~~php
$highestRow = $sheet->getHighestRow();
// $highestColには列の文字が入ります。
$highestCol = $sheet->getHighestColumn();
~~~

- 罫線の設定
~~~php
use PhpOffice\PhpSpreadsheet\Style\Border;

$minRow = 1;
$minCol = 'A';
$sheet->getStyle("{$minCol}{$minRow}:{$highestCol}{$highestRow}")
    ->getBorders()->getAllBorders()
    ->setBorderStyle(Border::BORDER_THIN);
~~~

- 列幅の設定
~~~php
foreach ( $sheet->getRowIterator() as $rowObj ) {
    $row = $rowObj->getRowIndex();
    if ($row < $startRow) continue;
    foreach ( $sheet->getColumnIterator() as $colObj ) {
        $col = $colObj->getColumnIndex();
        $cellValue = $sheet->getCell( $col.$row )->getValue();
        $strlen = mb_strlen( (string)$cellValue );
        // 1.5くらいかけると良さそう
        // 文字数が多いときは、少し小さい値をかけたほうが良さそう
        $width = $strlen >= 50 ? $strlen * 1.5 : $strlen * 2;
        $currentWidth = $sheet->getColumnDimension($col)->getWidth();
        if ($currentWidth < $width) {
            $sheet->getColumnDimension($col)->setWidth($width);
        }
    }
}
~~~

- セルの結合
~~~php
$sheet->mergeCells("A1:A2");
~~~

- シートの作成
~~~php
$sheet = $spreadsheet->createSheet();
~~~

- シートの削除
~~~php
$spreadsheet->removeSheetByIndex(0);
~~~

- セルの結合
~~~php
$sheet->mergeCells("A1:A2");
~~~

- 行の高さ設定
~~~php
// 1行目の高さを30に設定
$sheet->getRowDimension(1)->setRowHeight(30);
~~~

- 文字の寄せる方向の設定
~~~php
use PhpOffice\PhpSpreadsheet\Style\Alignment;

// 左寄せ
$sheet->getStyle("A1")
    ->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);
// 中央寄せ
$sheet->getStyle("A1")
    ->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
// 右寄せ
$sheet->getStyle("A1")
    ->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
~~~

- 文字にインデントをつける
~~~php
// 1文字分のインデントを設定
$sheet->getStyle("A1")
    ->getAlignment()->setIndent(1);
~~~

- 文字の改行を許可する
~~~php
$sheet->getStyle("A1")
    ->getAlignment()->setWrapText(true);
~~~

- 文字サイズの変更
~~~php
$sheet->getStyle("A1")
    ->getFont()->setSize('23');
~~~

- セルの詳細設定
~~~php
// 金額のフォーマット。1000を1,000にする
$sheet->getStyle("A1")
    ->getNumberFormat()->setFormatCode("#,##0");
~~~