PhpSpreadsheetで数値、文字列、金額、日付、画像をシートに書き込むサンプル

せっかくなので昨日書いた記事のPhpSpreadsheet版も書いてみることにした。

PHPExcelからPhpSpreadsheetに乗り換えたいという人なんかほとんど居ないと思うけど、そういうひとにとっては参考になるかもしれない。

ariarijp.hatenablog.com

環境

  • PHP 7.0.22
  • PHPExcel 1.0.0-beta

以前の記事でPhpSpreadsheetを紹介したころは開発版しか公開されていなかったけど、現在はbetaリリースまで進んでいる模様。

composer.jsonはこんな感じ。

{
    "require": {
        "phpoffice/phpspreadsheet": "1.0.0-beta"
    }
}

ちなみにドキュメントがRead the Docsで公開されているあたりに今どきっぽさがある。

PhpSpreadsheet Documentation

サンプルコード

サンプルで使用している画像はPHPExcelの記事同様PHPのロゴ。

<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Cell;
use PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;

date_default_timezone_set('Asia/Tokyo');

// http://php.net/images/logos/php-med-trans.png
$imagePath = 'php-med-trans.png';

// サンプルデータを適当に生成
$rows = array_map(function ($i) {
    return [
        $i, // 数値
        uniqid(), // 文字列
        rand(10000, 100000), // 数値(金額)
        strftime('%Y-%m-%d', rand(0, time())), // 日付
    ];
}, range(1, 20));

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// セルの書式を指定する時に必要
// http://phpspreadsheet.readthedocs.io/en/develop/topics/recipes/#write-a-date-or-time-into-a-cell
Cell::setValueBinder(new AdvancedValueBinder());

$offset = 1;
foreach ($rows as $i => $row) {
    $rowNum = $i + $offset;

    // A列からD列までの値を書き込み
    $sheet->fromArray($row, null, Cell::stringFromColumnIndex(0) . $rowNum);

    // C列の書式を金額(JPY)に変更
    $sheet->getCell(Cell::stringFromColumnIndex(2) . $rowNum)
        ->getStyle()
        ->getNumberFormat()
        ->setFormatCode('"¥"#,##0');

    // D列の書式をYYYY/MM/DD形式に変更
    $sheet->getCell(Cell::stringFromColumnIndex(3) . $rowNum)
        ->getStyle()
        ->getNumberFormat()
        ->setFormatCode(NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);


    (new Drawing())
        ->setPath($imagePath)
        ->setWorksheet($sheet)
        ->setHeight(30)
        ->setCoordinates(Cell::stringFromColumnIndex(4) . $rowNum);

    // 行の高さを画像にあわせて変更
    $sheet->getRowDimension($rowNum)
        ->setRowHeight(30);
}

// Excel(.xlsx)として書き出す
$writer = new XlsxWriter($spreadsheet);
$writer->save('sample.xlsx');

生成されるファイル

こんな雰囲気。Excelが手元にないのでLibreOfficeで表示。

f:id:ariarijp:20170823220105p:plain

まとめ

PHPExcelに比べてドキュメントが整っているのが良い。PHPExcelと見比べるとわかるけど、だいたいPHPExcelと同じインターフェースなので、移行しようと思ったらそれなりにできそうではある感じ。

名前空間がPSR-4準拠なので、そのあたりの書き味もPhpSpreadsheetの方が良い感じ。

最近Excelばかり触っているので、Excel拡張機能も作ってみたくなってきた。