PHP
PHPExcel
PhpSpreadsheet
PHP_XLSXWriter

PHPExcelの使い方メモです。

補足

インストール

composer require phpoffice/phpexcel

基本的な使い方例

https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Examples/01simple-download-xlsx.php

上記の例ようなB5等のセル位置を指定する方法よりも以下の列と行をしていする方法の方が便利そうです。

// Set cell B5 with a string value
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, 5, 'PHPExcel');

https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Documentation/markdown/Overview/07-Accessing-Cells.md#setting-a-cell-value-by-column-and-row

メモリ設定

PHPExcelはメモリを多く使うので使用する際には以下の設定を行っておくと良さそう。

// ファイルキャッシュに変更(遅くなるがメモリを大幅に減少)
PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_to_discISAM, ['dir' => '/tmp']);

https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Documentation/markdown/Overview/04-Configuration-Settings.md#phpexcel_cachedobjectstoragefactorycache_to_discisam

まとめ

// Excel作成
PHPExcel_Settings::setCacheStorageMethod(
    PHPExcel_CachedObjectStorageFactory::cache_to_discISAM,
    ['dir' => '/tmp']
);
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objSheet = $objPHPExcel->getActiveSheet();

$xlsx_data = [
    ['A1', 'B1', 'C1'],
    ['A2', 'B2', 'C1'],
];

foreach ($xlsx_data as $row_index => $row_data)
{
    foreach ($row_data as $column_index => $column_data)
    {
        $objSheet->setCellValueByColumnAndRow($column_index, $row_index + 1, $column_data);
    }
}

$current_datetime = new DateTimeImmutable(date('Y-m-d H:i:s'));
$file_name = 'test_' . $current_datetime->format('YmdHis') . '.xlsx';
$file_path = '/home/public/app/tmp/' . $file_name;

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save($file_path);

参考

https://qiita.com/nwsoyogi/items/a25d2bc050d53a79ab93
http://www.zedwood.com/article/php-excel-writer-performance-comparison