Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
61
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@yshishido

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

案件で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ですが。。。

出力されたファイル

48ffadd6a9bd52f701a8ccb7e6d24ecb.png

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

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

読み込むテンプレート

1a62127f7af1da1abb08fa975f8ff5bb.png

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

セルの結合

セルを結合する。セルの名前で指定して結合するパターンと、行列番号を指定してマージするパターン。行列番号を指定する場合は、列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');

出力されたファイル

2383c937aa2a46d88c1634c838c05b2f.png

セルのスタイル設定

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

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

線の種類

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

罫線を引く位置の設定

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

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

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

出力されたファイル

ef9c677f343d9733d9482347ba3cd325.png

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


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


参考サイト

61
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
61
Help us understand the problem. What is going on with this article?