"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

phpspreadsheetがチョー便利!phpからExcelの読み書きプログラミング



スポンサーリンク

ちょいとした業務要件でphpからExcel帳票に出力することがあったので、便利なphpspreadsheetのご紹介!

github.com

できること

できる機能は様々ですがざっと見た感じ以下のようなことができます。

  • 読み込み
    • ファイル名、シート名を指定して、特定のセルの情報を取得
  • 書き込み
    • ファイル名、シート名を指定して、特定のセルへ情報を書き込み
    • 画像ファイルを特定のセル上に貼り付け
    • 空行、空列の挿入。
    • セル結合
    • セル内の改行
    • 特定のセルに対する罫線、文字サイズ、色などの表示形式の設定

他、Excelの関数をphp内で使えます。ただ、VBAのオブジェクトを操作といったチェックボックスにチェック入れたりなどはできません。

図形などオートシェイプも利用不可。

私の場合、見積書とか請求書、またはwebから登録してくれたユーザのプロファイル情報をExcelに出力してメールに添付して担当者に送るというのをやりました。


それぞれのドキュメントをある程度、罫線とかセル結合してレイアウトを作っておいたものをサーバに上げておいて、それを元ネタに出力のときにセルにデータを挿入して新しいファイルを作ってます。

以下にファイル拡張子(xlsx,xlsなど)毎にできることとできないことがマトリクスでまとめられています。
https://phpspreadsheet.readthedocs.io/en/develop/references/features-cross-reference/

使い方

//読み込み
use PhpOffice\PhpSpreadsheet\Settings;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PhpOffice\PhpSpreadsheet\Writer\CSV as CSVWriter;

$source = "業務データ.xlsx"
$reader = new XlsxReader();

//シートを指定してインスタンス作成
//業務データ.xlsx内の"売上明細", "売上伝票","顧客名簿"のシートをメモリ上に取ってくるイメージ
$reader->setLoadSheetsOnly( array("売上明細", "売上伝票","顧客名簿") );
$spreadsheet = $reader->load($source);

//ロードしたシートの中から"売上明細"シートを$sheetとする
$sheet = $spreadsheet->getSheetByName("売上明細");

//特定の行番号の位置に行を空追加
$sheet->insertNewRowBefore(’行番号', '追加行数');

//A1に"データ"というテキストを入れる
$sheet->setCellValue("A1","データ");

//G1セルからP5セルの範囲を結合
$sheet->mergeCells('G1:P5');

//画像の貼り付け
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Logo');
$drawing->setDescription('Logo');
$drawing->setPath("画像のファイルパス");
$drawing->setHeight(500); ←高さpx
$drawing->setCoordinates('B1'); ←貼り付け場所
$drawing->setWorksheet($sheet); ←対象シート(インスタンスを指定)

// Excel(.xlsx)として書き出す
$writer = new XlsxWriter($spreadsheet);
$writer->save(”Excelのファイルパス");

補足

なぜか、composer installで入ってこなかったのでcomposer update で入れた。どうやらPHPspreadsheetはPHPExcelというものの置き換えのようでPHPExcelが評判がよくなかったようで今の主流?がPHPspreadsheetのようです。主流というか他選択肢がない・・・今のところ安定して動いています。