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

最近どうもExcelを扱うことが多いので、久しぶりにPHPExcelを触ってみたメモ。

以前PhpSpreadsheetを紹介したけれど、あえてPHPExcelを選んだのは困った時に検索などで情報を得やすいため。

ariarijp.hatenablog.com

環境

  • PHP 7.0.22
  • PHPExcel 1.8.1

composer.jsonはこんな感じ。

{
    "require": {
        "phpoffice/phpexcel": "^1.8"
    }
}

サンプルコード

サンプルで使用している画像はPHPのロゴ。

<?php

require 'vendor/autoload.php';

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

$book = new PHPExcel();
$sheet = $book->getActiveSheet();

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

    // 数値をセルに書き込み
    $sheet->setCellValueByColumnAndRow(0, $rowNum, $row[0]);

    // 文字列をセルに書き込み
    $sheet->setCellValueByColumnAndRow(1, $rowNum, $row[1]);

    // 数値をセルに書き込んで、書式を日本円に変更
    $sheet->setCellValueByColumnAndRow(2, $rowNum, $row[2], true)
        ->getStyle()
        ->getNumberFormat()
        ->setFormatCode('"¥"#,##0');

    $dt = DateTime::createFromFormat('Y-m-d', $row[3]);
    $date = PHPExcel_Shared_Date::PHPToExcel($dt, true, 'Asia/Tokyo');

    // 日付をセルに書き込んで、書式をYYYY/MM/DD形式に変更
    $sheet->setCellValueByColumnAndRow(3, $rowNum, $date, true)
        ->getStyle()
        ->getNumberFormat()
        ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

    // 画像をセルに書き込み
    (new PHPExcel_Worksheet_Drawing())
        ->setPath($imagePath)
        ->setWorksheet($sheet)
        ->setHeight(30)
        ->setCoordinates(PHPExcel_Cell::stringFromColumnIndex(4) . $rowNum);

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

// ファイルに書き出し
$writer = PHPExcel_IOFactory::createWriter($book, 'Excel2007');
$writer->save('sample.xlsx');

生成されるファイル

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

f:id:ariarijp:20170822232143p:plain

まとめ

見やすいドキュメントが見つからなかったものの、サンプルコードを読みつつ、PhpStormなどでコード補完が使えればなんとか使える。

レポートなどではGoogleスプレッドシートが使われることも多くなってきていますが、まだまだExcelとはお付き合いが続きますね。

仕事で使っているのがMicrosoft Office for Mac Home and Business 2011なので、そろそろOffice 365あたりに変えたいところ。特に評価シートを書いている途中で落ちるのがつらい。