忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP エクセルファイル出力の方法について(PHPExcel)

今回は PHPExcel で行う 「エクセルファイル出力」 について説明したいと思います。

このライブラリですが少し前のもので現在は更新が止まっていまして PhpSpreadsheet を使う様に推奨されています。 ただ、以前のプログラムのメンテ等もあると思いますので、まだまだ使われているのではないでしょうか。
PHPExcel の使用の説明が終わった後で PhpSpreadsheet の記事を載せたいと思います)





PHPExcel のダウンロードとインストール

PHPExcel のダウンロードは以下の所から行えます。

【GitHub】PHPOffice / PHPExcel
https://github.com/PHPOffice/PHPExcel

Clone or download ボタンをクリックし更に Download ZIP をクリックででダウンロードが開始されます。

以下の様に HTML ドキュメントのフォルダに展開します。 私のテスト環境はWindows上の xampp で行いますので C:\xampp\htdocs\ フォルダの中に _phpexcel フォルダを作成し PHPExcel-1.8.zip を展開しました。




■簡単なエクセルファイルの登録処理(ローカルフォルダ)

簡単なエクセルファイルの登録処理として、エクセルの先頭セルに 'ABCDEFG' の文字列を設定し、エクセルファイルをローカルフォルダに書込みます。 手順としては以下の様になります。

  • PHPExcel ライブラリの読込
  • PHPExcel オブジェクトの生成
  • エクセルのシートを取得し、先頭セルへの値設定
  • エクセルのファイル形式を指定し登録
<?php
// ライブラリ読込
require_once './PHPExcel-1.8/Classes/PHPExcel.php';

// PHPExcelオブジェクト作成
$objBook = new PHPExcel();

// シート設定
$objSheet = $objBook->getActiveSheet();

// [A1]セルに文字列設定
$objSheet->setCellValue('A1', 'ABCDEFG');

// [A2]セルに数値設定
$objSheet->setCellValue('A2', 123.56);

// [A3]セルにBoolean値設定
$objSheet->setCellValue('A3', TRUE);

// [A4]セルに書式設定
$objSheet->setCellValue('A4', '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))');

// Excel2007形式で保存する
$objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007");
$objWriter->save('test.xlsx');
exit();
?>

new PHPExcel(); でPHPExcelオブジェクトの作成の結果として新規のワークブックが生成されます。
このワークブックには必ず1個のワークシートが生成されています。
ワークシートは1個しかないので、アクティブなワークシートはその1個のワークシートが該当します。
よって getActiveSheet() メソッドでシートオブジェクトを取得します。 (getSheet(pIndex) メソッドでも同じことが出来ます。引数 pIndex は「0」からのワークシートのIndexです。)

後は、ワークシートオブジェクトの setCellValue() メソッドで文字列、数値、Boolean値、書式の設定を行います。

最後にエクセルファイルを保存するのですが PHPExcel_IOFactory クラスの静的メソッドの createWriter を使って PHPExcel_Writer_IWriter オブジェクトを生成します。 PHPExcel_Writer_IWriter オブジェクトの唯一のメソッド save で保存します。保存結果は以下の様になります。

ワークシートオブジェクトの getCell() メソッドでセルオブジェクトを取得し、 セルオブジェクトの setValue() メソッドを使って以下の様にすることもできます。

<?php
// ライブラリ読込
require_once './PHPExcel-1.8/Classes/PHPExcel.php';

// PHPExcelオブジェクト作成
$objBook = new PHPExcel();

// シート設定
$objSheet = $objBook->getSheet(0);

// [A1]セルに文字列設定
$objSheet->getCell('A1')->setValue('ABCDEFG');

// [A2]セルに数値設定
$objSheet->getCell('A2')->setValue('123.56');

// [A3]セルにBOOLEAN設定
$objSheet->getCell('A3')->setValue(TRUE);

// [A4]セルに書式設定
$objSheet->getCell('A4')->setValue('=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))');

// Excel2007形式で保存する
$objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007");
$objWriter->save('test1-2.xlsx');
exit();
?>



■簡単なエクセルファイルのダウンロード処理

上の例ではローカルのフォルダーにエクセルファイルを保存しましたが、PHPのプログラムから直接ブラウザに対して送信する方法があります。 手順としては以下の様になります。

  • PHPExcel でシートデータを作成する
  • 出力するドキュメントタイプをHTTPヘッダーでブラウザに送信する
  • PHPExcel_Writer_IWriterで“php://output”に出力する

上記のソースを以下の様に変更します。

<?php
// ライブラリ読込
require_once './PHPExcel-1.8/Classes/PHPExcel.php';
// PHPExcelオブジェクト作成
$objBook = new PHPExcel();
// シート設定
$objSheet = $objBook->getActiveSheet();

// [A1]セルに文字列設定
$objSheet->setCellValue('A1', 'ABCDEFG');
// [A2]セルに数値設定
$objSheet->setCellValue('A2', 123.56);
// [A3]セルにBOOLEAN設定
$objSheet->setCellValue('A3', TRUE);
// [A4]セルに書式設定
$objSheet->setCellValue('A4',  '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))');

// ブラウザへの指定
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="test.xlsx"');
header('Cache-Control: max-age=0');
// Excel2007形式で出力
$objWriter = PHPExcel_IOFactory::createWriter($objBook, 'Excel2007');
$objWriter->save('php://output'); 
?>


この処理は注意する点があるのですが、エクセル出力を行う前までに、ブラウザに対して表示出力を行うとダウンロード処理がうまくいきません。 PHP開始タグ <?php のタグの前に空白を入れず、PHP終了タグ ?> の後に最大で1つの改行を入れます。


■ローカルのエクセルファイルを読込み、データ追加後の登録処理

これまでは新規にエクセルファイルを作成する処理でしたが、サーバ側のローカルフォルダに存在するエクセルファイルを読込み、 その後データを追加する処理を説明します。

new PHPExcel(); でPHPExcelオブジェクトの作成している部分を PHPExcel_IOFactory クラスの静的メソッドの load を使ってエクセルファイルを読込み PHPExcelオブジェクト を生成します。
尚、ブラウザに対してファイル名にシステム日付と時刻を付加して返しています。

<?php
// ライブラリ読込
require_once './PHPExcel-1.8/Classes/PHPExcel.php';
// [test.xlsx] ファイルをロードしPHPExcelオブジェクト作成
$objBook = PHPExcel_IOFactory::load('./test.xlsx');
// シート設定
$objSheet = $objBook->getActiveSheet();
// [A5]セルに文字列設定
$objSheet->setCellValue('A5', 'abcdefghijk');

// ブラウザへの指定
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="test'.date("Y-m-d_His").'.xlsx"');
header('Cache-Control: max-age=0');
// Excel2007形式で出力
$objWriter = PHPExcel_IOFactory::createWriter($objBook, 'Excel2007');
$objWriter->save('php://output'); 
?>

FireFox でのダウンロードの表示は以下の通りです。

この方法は、テンプレートファイルを作成しておきクライアント側からの要求により対応するデータを設定し、 クライアントのブラウザに出力するといったことに使えると思います。













PR

コメント

コメントを書く