忍者ブログ

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

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

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

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




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

簡単なエクセルファイルの登録処理として、エクセルの[A1]~[A4]セルに文字列、数値、Bool値、計算式を設定し、エクセルファイルをローカルフォルダに書込みます。 手順としては以下の様になります。

  • PhpSpreadsheet ライブラリの読込準備(autoload.php)
  • PhpSpreadsheet オブジェクトの生成
  • エクセルのシートを取得し、セルへの値設定
  • エクセルのXLSX形式を指定し登録
<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// Spreadsheetオブジェクト生成
$objSpreadsheet = new Spreadsheet();
// シート設定
$objSheet = $objSpreadsheet->getActiveSheet();

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

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

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

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

// XLSX形式オブジェクト生成
$objWriter = new Xlsx($objSpreadsheet);
// ファイル書込み
$objWriter->save('test1-1.xlsx');
exit();
?>

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

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

最後にエクセルファイルを保存するのですが Xlsx クラスオブジェクトを生成します。 Xlsx オブジェクトのメソッド save で保存します。保存結果は以下の様になります。

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

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// Spreadsheetオブジェクト生成
$objSpreadsheet = new Spreadsheet();
// シート設定
$objSheet = $objSpreadsheet->getActiveSheet();

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

// [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))');

// XLSX形式オブジェクト生成
$objWriter = new Xlsx($objSpreadsheet);
// ファイル書込み
$objWriter->save('test1-2.xlsx');
exit();
?>



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

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

  • Spreadsheet でシートデータを作成する
  • 出力するドキュメントタイプをHTTPヘッダーでブラウザに送信する
  • Xlsx オブジェクトのメソッド save で“php://output”に出力する

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

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// Spreadsheetオブジェクト生成
$objSpreadsheet = new Spreadsheet();
// シート設定
$objSheet = $objSpreadsheet->getActiveSheet();

// [A1]セルに文字列設定
$objSheet->setCellValue('A1', 'Spreadsheet');
// [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="test1-3.xlsx"');
header('Cache-Control: max-age=0');
// XLSX形式オブジェクト生成
$objWriter = new Xlsx($objSpreadsheet);
// ファイル書込み
$objWriter->save('php://output'); 
?>


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

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

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

new Spreadsheet(); でPhpSpreadsheetオブジェクトの作成している部分を \PhpOffice\PhpSpreadsheet\IOFactory クラスの静的メソッドの load を使ってエクセルファイルを読込み PhpSpreadsheetオブジェクト を生成します。 その後、あるセルへの変更値を設定します。
尚、ブラウザに対してファイル名にシステム日付と時刻を付加して返しています。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// [test1-1.xlsx] ファイルをロードしPhpSpreadsheetオブジェクト作成
$objSpreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('./test1-1.xlsx');
// シート設定
$objSheet = $objSpreadsheet->getActiveSheet();
// [B1]セルに文字列設定
$objSheet->setCellValue('B1', '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');
// XLSX形式で出力
$objWriter = new Xlsx($objSpreadsheet);
$objWriter->save('php://output'); 
?>

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

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












PR

コメント

コメントを書く