eightban's memo

残しておきたい記事をまとめてみました。このブログに書いてあるドキュメントやブログで配布しているファイルの使用によって発生するいかなる損害に対してもこのブログの管理者は責任を負いません。使用する場合は自己責任のもとに使用してください。

PHP

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

更新日:

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

Copyright© eightban's memo , 2024 All Rights Reserved Powered by STINGER.