0
0

More than 1 year has passed since last update.

phpspreadsheetで使ったメソッド

Last updated at Posted at 2022-12-24

一部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");
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0