一部CakePHPのコードが混ざっています。
適宜変換してください。
- 雛形ファイルからインスタンス化して出力するまで
<?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);
}
}
- フォント設定
$sheet = $spreadsheet->getDefaultStyle()->getFont()
->setName('MS ゴシック');
- シートを取得
// 現在開いているシート
$sheet = $spreadsheet->getActiveSheet();
// 最初のシート
$sheet = $spreadsheet->getSheet(0);
- シートタイトルの設定
$sheet->setTitle('シートの名前');
- 値の設定(一括)
$data = [
['A1に入る値', 'B1に入る値', 'C1に入る値'],
['A2に入る値', 'B2に入る値', 'C2に入る値'],
];
$sheet->fromArray($data, null, 'A2', true);
- 値の設定(個別)
$sheet->setCellValue('A1', 'A1に入る値');
// 配列に入れてforeachで設定してもいいかもしれないです
$array = ['A1' => 'A1に入る値', 'A2' => 'A2に入る値'];
foreach ($array as $cell => $value) {
$sheet->setCellValue($cell, $value);
}
- シートの最大列と最大行の取得
$highestRow = $sheet->getHighestRow();
// $highestColには列の文字が入ります。
$highestCol = $sheet->getHighestColumn();
- 罫線の設定
use PhpOffice\PhpSpreadsheet\Style\Border;
$minRow = 1;
$minCol = 'A';
$sheet->getStyle("{$minCol}{$minRow}:{$highestCol}{$highestRow}")
->getBorders()->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
- 列幅の設定
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);
}
}
}
- セルの結合
$sheet->mergeCells("A1:A2");
- シートの作成
$sheet = $spreadsheet->createSheet();
- シートの削除
$spreadsheet->removeSheetByIndex(0);
- セルの結合
$sheet->mergeCells("A1:A2");
- 行の高さ設定
// 1行目の高さを30に設定
$sheet->getRowDimension(1)->setRowHeight(30);
- 文字の寄せる方向の設定
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);
- 文字にインデントをつける
// 1文字分のインデントを設定
$sheet->getStyle("A1")
->getAlignment()->setIndent(1);
- 文字の改行を許可する
$sheet->getStyle("A1")
->getAlignment()->setWrapText(true);
- 文字サイズの変更
$sheet->getStyle("A1")
->getFont()->setSize('23');
- セルの詳細設定
// 金額のフォーマット。1000を1,000にする
$sheet->getStyle("A1")
->getNumberFormat()->setFormatCode("#,##0");