4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WindowsでPHPから入力したデータをExcelに出力する

Last updated at Posted at 2020-05-27

PHPからデータをExcelに出力する手順

composerの入手

composerPHPのパッケージ管理ツール

もっと簡単に言えば、何かパッケージをインストールするときに、それを動かすのに必要な他のパッケージも一緒にインストールしてくれるというもの。

PHPからExcelにデータを出力するには、PhpSpreadsheetというパッケージが必要になる。
それを入手するためにまず、このcomposerをPCで使えるようにする。

Introduction - Composer から Composer-Setup.exeをダウンロードして、実行。
インストールの詳しい手順はComposerインストール手順(Windows) を参考に。
インストール完了後、コマンドプロントでcomposerを実行し、以下のような表記が出たら完了。

>composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.6 2020-05-06 10:28:10

パッケージのインストール

作業するディレクトリを作成し、そこに移動。
そして、コマンドプロントで以下のコマンドを実行。
このコマンドを実行することで、PHPのデータをExcelに出力できるパッケージがインストールされる。

composer require phpoffice/phpspreadsheet

また、venderというディレクトリ、composer.json,composer.lockというファイルも作成されるため、どのような記述がされているか確認しておく。
それぞれの構成やcomposerの使い方に関しては以下の記事を参照。
composerとは

PHPファイルの作成

続いて、PHPファイルの作成に移る。
Excelにデータを出力するといっても色々な形があるが、今回はセルにいくつかの値を埋め込んだExcelファイルを作成する。
PHPExcelでエクセル出力入門を参考にPHPファイルを作成した。
上記の記事はphpExcelという少し前のパッケージを使用していたため、PhpSpreadsheetの使い方も参考に、phpSpreadsheetでのコード記入を行った。

ExcelOutput.php
<?php
date_default_timezone_set("Asia/Tokyo");
require __DIR__ . "/vendor/autoload.php";

// Excelの読み込み
$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getSheet(0);

// Excelに出力するデータの設定
$sheet->setCellValue("A1", "データ1");
$sheet->setCellValue("A2", "データ2");
$sheet->setCellValue("A3", "データ3");

$sheet->setCellValue("B4", "データ4");
$sheet->setCellValue("B5", "データ5");
$sheet->setCellValue("B6", "データ6");

// Excelに出力
$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save("ExcelOutput.xlsx");
?>

その後、コマンドプロントで作業ディレクトリに移り、以下のコマンドを実行する。

>php ExcelOutput.php

エラーがなければ、作業ディレクトリにExcelOutput.xlsxが作成されている。
その中身は以下のようになっている。

screeenshot.png

テンプレートを読み込んで出力

もう少し踏み込んで、PhpSpreadsheetを使いならせるようにしていく。
既存のExcelを読み、その形式をコピーした新しいExcelファイルを出力できるようにする。

テンプレートのダウンロード

MicrosoftがExcelのテンプレートを配布しているので、そこから好きなテンプレートをダウンロードして、作業ディレクトリに置く。
自分は業務計画表(下半期)をダウンロードした。

ファイル名がローマ字表記なので、phpファイルで書く量を減らせるように名前を変えるのもアリ。
自分は業務計画表.xltxにした。

テンプレートの読み込み

PhpSpreadsheetに書き込むを参考に進めていく。

IOFactry::load("テンプレートのファイル")でテンプレートのExcelファイルを読み込む。
$sheet = $spreadsheet->getSheet(1);で2枚目のシートの読み込みを設定。
シートの読み方は配列と同じように、**0,1…**と0から数えるので設定する数字を間違えないように注意。

ExcelOutput.php
// テンプレートの読み込みとシートの読み込み
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("業務計画表.xltx");
$sheet = $spreadsheet->getSheet(1);

あとは、出力部分は変わらないので、データを記入するセルを書き込みたい場所に変更するだけでOK。

出力するとこんな感じに。
screeenshot.png

シート名を変えたい場合は以下のコードを出力部分に設定するだけでOK。

ExcelOutput.php
$sheet->setTitle("シート名");

シートの削除

業務計画表.xltxにはシートが2つあり、1枚目が「使い方」、2枚目がデータを記入する「下半期 業務計画表」となっている。
使用するテンプレートは2枚目だけなので1枚目を削除した状態で出力したい。
そのような場合は、以下のコードでシートを削除できる。
PhpSpreadsheetでシートのコピーと削除|teratailを参考にさせてもらった。

ExcelOutput.php
$sheetIndex = $spreadsheet->getIndex(
    $spreadsheet->getSheetByName("使い方")
    // 削除したいシート名を""に記入
);
$spreadsheet->removeSheetByIndex($sheetIndex);

処理としては、""で指定されたシート名のインデックスを取得し、それを用いて削除するという単純なもの。

ただ、テンプレートによってはシート間で連携している可能性もあり、片方のシートを削除してしまうとExcelファイルとして使えなくなることもある。
削除する前にシート間での連携などがないか、あっても削除して大丈夫かを確認しておく。

ExcelOutput.php

ExcelOutput.php
<?php
// https://qiita.com/kaitaku/items/d7c7b91d2f995fad3fc8
date_default_timezone_set("Asia/Tokyo");
require __DIR__ . "/vendor/autoload.php";

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("業務計画表.xltx");
$sheet = $spreadsheet->getSheet(1);
$sheetIndex = $spreadsheet->getIndex(
    $spreadsheet->getSheetByName("使い方")
);
$spreadsheet->removeSheetByIndex($sheetIndex);

$sheet->setCellValue("B22", "データ1");
$sheet->setCellValue("E22", "データ2");
$sheet->setCellValue("G22", "データ3");

$sheet->setCellValue("I23", "データ4");
$sheet->setCellValue("K23", "データ5");
$sheet->setCellValue("M23", "データ6");

$sheet->setTitle("ExcelOutput");
$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save("ExcelOutput.xlsx");
?>

参考資料

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?