PHPをインストールしExcelを操作する ~ PHP

2018年8月3日

PHPはwebサイトで使用されている言語で、ブログなどで使われているWordpressもPHPで開発されているそうです。

XAMPP Apache + MariaDB + PHP + Perlの統合環境を導入しても良いのですが、今回はインストールの使用容量も少ないPHPをインストールし、excelの操作まで行ってみます。75Mb程度です。

PHPのインストール

下記サイトより、NonThreadタイプのZipファイルをダウンロードします。

https://windows.php.net/download/

IISを使用する場合はNon-Threadタイプ、Apacheを使用する場合はThreadタイプを選ぶように書いてありますが、今回はWebプログラミングでないのでどちらでも構いませんが、Non-Threadタイプを選びます。32ビット64ビットがありますが、ぞれぞれのPCにより選択してください。

PHPプログラムのインストール

ダウンロードした「php-7.2.6-nts-Win32-VC15-x64.zip」を解凍しますが、次のフォルダを作って、そのフォルダに展開します。

D:\oss\PHP\PHP726

php-7.2.6のフォルダではうまく動かない場合があったので、そのようにしています。

別バージョンも管理できるようにこのようにしました。

VC++ランタイムのインストール

The VC15 builds require to have the Visual C++ Redistributable for Visual Studio 2017 x64 or x86 installed

となっているので、VS2017のランタイムが入っていない場合は下記サイトからダウンロードしてインストールします。

https://www.visualstudio.com/ja/downloads/?q=#other-ja

ダウンロードボタンのリンク先です。

https://aka.ms/vs/15/release/VC_redist.x64.exe

composerのインストール

excelライブラリを入れたいのですが、その前にPHPのライブラリの管理ツール「composer」をインストールしておきます。

手動でインストールする方法もありますが、Windows用に簡単にセットアップするツールがあるので、それを使用させてもらいます。

https://getcomposer.org/

次の画面で「Composer-Setup.exe」をダウンロードします。

composerセットアップツールの実行

環境変数も変更してくれます。

phpspreadsheetのインストール

excelの操作ができるphpspreadsheetは下記サイトにありますが、composerでインストールします。

https://github.com/PHPOffice/PhpSpreadsheet

MSDOSプロンプトを管理者権限で開きます。

D:\oss\PHP\PHP726>composer require phpoffice/phpspreadsheet

実行しても無反応となった場合はPCを再起動して、同じコマンドをいれてください。

しかし、動いた場合でも下記のようなエラーが出た場合はphp.iniを編集するように書いてあります。

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - phpoffice/phpspreadsheet 1.3.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
    - phpoffice/phpspreadsheet 1.3.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
    - phpoffice/phpspreadsheet 1.3.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
    - Installation request for phpoffice/phpspreadsheet 1.3.1 -> satisfiable by phpoffice/phpspreadsheet[1.3.1].

  To enable extensions, verify that they are enabled in your .ini files:
    - D:\oss\PHP\PHP726\php.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

d:\oss\PHP\PHP726\ext\php_gd2.dll があることを確認し

D:\oss\PHP\PHP726\php.iniの最後に次の行を追加します。

extension=php_gd2.dll

再度、下記コマンドをいれます。

D:\oss\PHP\PHP726>composer require phpoffice/phpspreadsheet

うまく動くと下記のようなメッセージがでます。

./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing psr/simple-cache (1.0.1): Downloading (100%)
  - Installing phpoffice/phpspreadsheet (1.3.1): Downloading (100%)
phpoffice/phpspreadsheet suggests installing mpdf/mpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing dompdf/dompdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing tecnick.com/tcpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing jpgraph/jpgraph (Option for rendering charts, or including charts with PDF or HTML Writers)
Writing lock file
Generating autoload files

vendorフォルダが作成され、composerとphpofficeのフォルダ、autoload.phpができています。

hello world

helloworld.phpのプログラムを作成して、どこでもよいのですがファイルを保存します。

D:\oss\PHP\PHP726\workspace\helloworld.phpとしました

<?php
    echo "Hello World!";

下記のようにコマンドプロンプトで実行すると「Hello World!」が表示されました。

D:\oss\PHP\PHP726\workspace>php helloworld.php
Hello World!

excelの入出力サンプル

A1セルに値をセットしexcelファイルに出力し、入力後A2セルに値をセットしてexcelとcsvに出力するサンプルです。

composerのautoload.phpでオートロードしてくれるので、2行目のautoloadを忘れずに入れてください。

入れないと下記のようなエラーがでます。

PHP Fatal error:  Uncaught Error: Class 'PhpOffice\PhpSpreadsheet\Spreadsheet' not found in D:\oss\PHP\PHP726\workspace\test.php:11
Stack trace:
#0 {main}
  thrown in D:\oss\PHP\PHP726\workspace\test.php on line 11

 

<?php
require "d:/oss/php/php726/vendor/autoload.php";

use PhpOffice\PhpSpreadsheet\Settings;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PhpOffice\PhpSpreadsheet\Writer\CSV as CSVWriter;

// Excel出力
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'A1');
$writer = new XlsxWriter($spreadsheet);
$writer->save('test-1.xlsx');

// Excel読込
$reader = new XlsxReader();
$spreadsheet = $reader->load('test1.xlsx');
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A2', 'A2');
   
// Excel出力
$writer = new XlsxWriter($spreadsheet);
$writer->save('test-2.xlsx');

// CSV出力
$sheet->setCellValue('A1', 'a1');
$sheet->setCellValue('B1', 'b1');
$sheet->setCellValue('A2', 'a2');
$sheet->setCellValue('B2', 'b2');
$writer = new CSVWriter($spreadsheet);
$writer->save('test-2.csv');

csvを読みこみexcelテンプレートに出力するサンプル

よくあるcsvファイルを読み込んでexcelシートにセットして出力するサンプルです。

あ,い,う
a1,b1,c1
a2,b2,c2

のようなCSVデータと何も入れていないxlsxファイルを用意してください。

前回作成したファイルを使って動かします。エラーの制御は入れていないので、業務で使用する場合は適宜変更してください。

 

<?php
require "d:/oss/php/php726/vendor/autoload.php";

use PhpOffice\PhpSpreadsheet\Settings;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PhpOffice\PhpSpreadsheet\Writer\CSV as CSVWriter;

// Excel読込
$reader = new XlsxReader();
$spreadsheet = $reader->load('test.xlsx');

// CSV読込
$line = 0;
$fp = fopen( 'test.csv', 'r' );
while( $dataRow = fgetcsv( $fp ) ) {
  $line++;
  for($i = 0; $i < count( $dataRow ); ++$i ){
//列、行指定
    $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow( $i + 1, $line, $dataRow[$i] );
  }
}
fclose( $fp );

   
// Excel出力
$writer = new XlsxWriter($spreadsheet);
$writer->save('test0.xlsx');

 

PHP

Posted by eightban