勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PhpSpreadsheetでフォーマット用のエクセルを読み込み、指定したセルにデータを書き込んだ上で別名で保存する方法

  PHP

PHPで納品書等のフォーマット用のExcelを読み込み、指定したセルにデータを書き込んだ上で別ファイル名としてサーバに保存させたい。調べてみたところ以前にちょっとだけ触ったPhpSpreadsheetというライブラリで容易に実装できる模様。以下に実装方法をメモ。

 

PhpSpreadsheetについて

公式サイト

https://phpspreadsheet.readthedocs.io/en/latest/

インストール方法

サーバにSSH接続し以下の手順でインストールする。

#インストールしたいディレクトリに移動
cd /aaa/bbb/ccc/phpspreadsheet

#PhpSpreadsheetのインストール
composer require phpoffice/phpspreadsheet

#(必要に応じて)パーミッションと所有者・グループの変更
chown -R testuser:testuser /aaa/bbb/ccc/phpspreadsheet
chmod -R 755 /aaa/bbb/ccc/phpspreadsheet

 

フォーマット用エクセルについて

テスト用としてこちらのサイトのエクセルシートをダウンロードしformat.xlsxにリネームしてサーバにアップロードした。

ちなみに以下のような内容になっており「数量」を入れると「金額・小計・消費税・合計」が計算され表示されるというもの。

今回はテストとして「概要」「数量」を2つずつ記入してみたい。

 

PHP側

ソースコード

<?php
require 'vendor/autoload.php';

//フォーマット用のエクセル
$format_file = 'format.xlsx';

//新しく作成するエクセル
$new_file = date('YmdHis') . '.xlsx';

//【セル番号 : 内容】になるよう配列を作成
$data_list = array(
    'A15' => '商品名1',
    'D15' => '1',
    'A16' => '商品名2',
    'D16' => '3',
);

//フォーマット用のエクセルの読み込み
$format_sheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($format_file);

//選択されているシートを取得
$work_sheet = $format_sheet->getActiveSheet();

//データを書き込み
foreach( $data_list as $cell => $content ){
    $work_sheet->getCell($cell)->setValue($content);
}

//別名でファイルを保存
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($format_sheet, 'Xlsx');
$writer->save($new_file);

上記プログラムを実行すると以下内容のファイルが生成された。

「金額・小計・消費税・合計」の計算部分も正常に反映されている。

シートを指定したい場合

フォーマット用エクセル内にシートが3つあり、3つ目のシートにデータを記入したいというケースの場合は以下部分を書き換える。

//選択されているシートを取得
//$work_sheet = $format_sheet->getActiveSheet();

//シートを指定する場合
$work_sheet = $format_sheet->getSheet(2);

getSheet()の引数にシート番号を入れる。「0」から始まるため今回の場合は引数は「2」になる。

「Warning: fopen(xxxxxxxxxxx.xlsx): failed to open stream: Permission denied in」エラーが出る場合

ディレクトリのパーミッションを「775」もしくは「777」に変更すること。

 

所感

セル番号を指定してデータを書き込めるというのが直感的に分かりやすく、思ったよりも容易に実装できた。

あとはできればPhpSpreadsheetのインストールをcomposer無しで行いたかったんだけど方法が見つからなかった。

 - PHP

  関連記事

PHPのHTTPリクエストライブラリ「Requests for PHP」の利用方法

PHPで外部のAPI等にリクエストする際に可能であればfile_get_cont ...

PHP5.4系でAPCが上手く動かなかったので5.5にアップデート&Zend OPcache導入

PHP5.3系から5.4系にアップデートしてから、WordPressがちょっと重 ...

Composerで後から別のパッケージを追加する方法と削除する方法

Composerで何らかのパッケージをインストールし、後から別のパッケージを追加 ...

PHPにてmicrotimeで秒数を測定した際「xxxxxE-5」のような値になる場合の対応方法

PHPで過去記事を参考の上、あるプログラムの処理にかかった時間を測定しようとした ...

HTMLにてaタグクリック時にping属性のデータをPHPで受け取る方法

HTMLのaタグにping属性というものを設定できるらしく、設定したリンクをクリ ...