はじめに (対象読者・この記事でわかること)

この記事は、PHPでWebアプリケーション開発を行っており、Excelファイルの出力機能の実装を検討している方を対象としています。特に、PHPExcelライブラリを利用してExcelファイルを生成する際に、印刷時のページ方向(縦向き・横向き)をプログラムから制御したいと考えている方にとって役立つ内容です。

この記事を読むことで、PHPExcelを使ったExcelファイル生成の基本的な流れから、ページ方向を設定するための具体的なコード例、さらには用紙サイズや余白といった関連する印刷設定についても理解を深めることができます。ユーザーがダウンロードしたExcelファイルが、最初から適切な印刷設定になっていることで、より使いやすいアプリケーションを提供できるようになるでしょう。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 * PHPの基本的な文法と開発環境(Webサーバー、PHP実行環境) * Composerの基本的な使い方(PHPライブラリのインストール) * Excelの基本的な操作(シートの編集、印刷設定の確認など)

WebアプリケーションにおけるExcel出力と印刷設定の重要性

WebアプリケーションからExcelファイルを生成する機能は、請求書、レポート、データリストなど、様々な帳票出力の場面で非常に重宝されます。しかし、単にデータをExcelに出力するだけでなく、利用者がダウンロードしたExcelファイルをすぐに印刷できる状態に整えることは、ユーザーエクスペリエンス(UX)を向上させる上で非常に重要です。

特に、印刷時の「ページ方向(縦向き・横向き)」は、出力されるデータの特性によって大きく変わります。例えば、行数の多いリストは縦向き、列数の多いデータやグラフを含むレポートは横向きが適していることが多いでしょう。このページ方向が適切に設定されていないと、ユーザーはExcelファイルを開いてから手動で設定を変更する手間が発生し、作業効率の低下やフラストレーションにつながる可能性があります。

PHPExcel(またはその後継であるPhpSpreadsheet)は、PHPでExcelファイルを操作するための強力なライブラリです。セルへのデータ書き込みはもちろん、セルの結合、書式設定、さらには今回扱うページ方向を含む印刷設定まで、多岐にわたるExcelの機能をプログラムから制御できます。本記事では、このPHPExcelを活用して、ユーザーフレンドリーなExcel出力機能を実現するためのページ方向設定に焦点を当てて解説します。

PHPExcelでページ方向を設定する具体的な手順とコード例

ここでは、PHPExcelを使ってExcelファイルを生成し、その際にページ方向を「横向き」に設定する具体的な手順をコード例を交えて解説します。

ステップ1: PHPExcelのインストールと基本的なExcelファイルの準備

まず、PHPExcelライブラリをComposerを使ってプロジェクトにインストールします。

Bash
composer require phpoffice/phpexcel

※注: PHPExcelは現在メンテナンスモードに入っており、後継のライブラリとしてPhpSpreadsheetが推奨されています。本記事ではPHPExcelに焦点を当てますが、新規開発の場合はPhpSpreadsheetの利用を強くお勧めします。PhpSpreadsheetでも同様の機能が提供されています。

次に、PHPExcelを使って基本的なExcelファイルを作成する準備をします。

Php
<?php require_once 'vendor/autoload.php'; use PHPExcel_IOFactory; use PHPExcel; use PHPExcel_Cell_DataType; // 型指定に必要であれば // 新しいPHPExcelオブジェクトを作成 $objPHPExcel = new PHPExcel(); // アクティブなシートを選択 (最初のシート) $objPHPExcel->setActiveSheetIndex(0); $sheet = $objPHPExcel->getActiveSheet(); // シートのタイトルを設定 $sheet->setTitle('売上データ'); // ヘッダーを書き込む $sheet->setCellValue('A1', '商品名'); $sheet->setCellValue('B1', '単価'); $sheet->setCellValue('C1', '数量'); $sheet->setCellValue('D1', '合計'); // データ行を書き込む $sheet->setCellValue('A2', 'PC'); $sheet->setCellValue('B2', 120000); $sheet->setCellValue('C2', 2); $sheet->setCellValue('D2', '=B2*C2'); // 数式も設定可能 $sheet->setCellValue('A3', 'モニター'); $sheet->setCellValue('B3', 30000); $sheet->setCellValue('C3', 3); $sheet->setCellValue('D3', '=B3*C3'); $sheet->setCellValue('A4', 'キーボード'); $sheet->setCellValue('B4', 8000); $sheet->C4 = 5; // 別途代入方法 $sheet->D4 = '=B4*C4'; // 合計行 $sheet->setCellValue('C5', '総合計:'); $sheet->setCellValue('D5', '=SUM(D2:D4)'); // カラム幅を自動調整 (見やすいように) foreach(range('A','D') as $columnID) { $sheet->getColumnDimension($columnID)->setAutoSize(true); } ?>

ステップ2: ページ方向(横向き・縦向き)の設定とその他の印刷設定

ここからが本題のページ方向設定です。PHPExcelでは、getActiveSheet() で取得したシートオブジェクトから getPageSetup() メソッドを呼び出し、PHPExcel_Worksheet_PageSetup オブジェクトを取得します。このオブジェクトに対して setOrientation() メソッドを使用することで、ページ方向を設定できます。

ページ方向には以下の定数が用意されています。 * PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT (縦向き) * PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE (横向き)

今回は、列数の多いデータなので「横向き」に設定してみましょう。

Php
<?php // ... (前述のExcelファイル準備コード) ... use PHPExcel_Worksheet_PageSetup; // ページ設定の定数を利用するために追加 // ページ設定を取得 $pageSetup = $sheet->getPageSetup(); // ページ方向を横向きに設定 $pageSetup->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); // 用紙サイズをA4に設定 (オプション) $pageSetup->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4); // 拡大縮小率を設定 (オプション、100%は等倍) $pageSetup->setScale(90); // 90%に縮小して印刷 // 印刷範囲を設定 (オプション) // 例: A1からD5までを印刷範囲とする $pageSetup->setPrintArea('A1:D5'); // 余白を設定 (オプション、インチ単位) $pageSetup->setMargins(0.5, 0.5, 0.75, 0.75); // 左、右、上、下 // ... (後述のファイル出力コード) ... ?>

ステップ3: Excelファイルの出力とダウンロード

最後に、作成したExcelファイルをユーザーがダウンロードできるように出力します。Webブラウザに直接出力する場合は、適切なHTTPヘッダーを設定する必要があります。

Php
<?php // ... (Excelファイル準備、ページ方向設定コード) ... // ヘッダーを設定してExcelファイルとしてダウンロードさせる header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="売上データ_'. date('Ymd') .'.xlsx"'); header('Cache-Control: max-age=0'); // IE9でのダウンロード対策 header('Cache-Control: max-age=1'); // If you're serving to IE over SSL, then the following may be needed header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header ('Pragma: public'); // HTTP/1.0 // Writerオブジェクトを作成し、Excelファイルに書き出す $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); // ブラウザに出力 // オブジェクトを解放 $objPHPExcel->disconnectWorksheets(); unset($objPHPExcel); ?>

このコードを実行すると、売上データ_YYYYMMDD.xlsx という名前のExcelファイルがダウンロードされます。ダウンロードしたファイルを開き、印刷プレビューを確認すると、設定した通りページが「横向き」になっていることを確認できるでしょう。

ハマった点やエラー解決

PHPExcelのバージョンとPhpSpreadsheetへの移行

問題点: PHPExcelは古く、PHPの新しいバージョン(PHP 7.4以上)では動かない場合や、非推奨の警告が出ることがあります。また、開発が終了しており、新しい機能追加やバグ修正は期待できません。

解決策: 新規開発や既存システムの刷新を検討している場合は、PHPExcelの後継である PhpSpreadsheet への移行を強く推奨します。PhpSpreadsheetは現代のPHP開発に最適化されており、名前空間の利用やComposerによる管理が容易です。ページ方向設定についても、ほぼ同じAPIで実現できます。

例: PhpSpreadsheetでのページ方向設定

Php
<?php use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // ... (データ書き込み) ... $pageSetup = $sheet->getPageSetup(); $pageSetup->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); // 定数の名前が変わる点に注意 $pageSetup->setPaperSize(PageSetup::PAPERSIZE_A4); $writer = new Xlsx($spreadsheet); $writer->save('php://output'); ?>

HTTPヘッダー設定の不備によるダウンロードエラー

問題点: header() 関数によるContent-TypeやContent-Dispositionの設定が正しくないと、ファイルがダウンロードされずに文字化けしたテキストが表示されたり、ファイル名が意図しないものになったりすることがあります。特に、ob_start()ob_end_clean() を使用せずに、HTML出力の後にExcel出力を行おうとすると、バイナリデータの前に余計な出力が混ざり、ファイルが破損することがあります。

解決策: Excelファイルの出力処理は、HTML出力など他の出力が行われる前に行う必要があります。もし、何らかの理由で他の出力と混ざる可能性がある場合は、出力バッファリング (ob_start(), ob_end_clean()) を適切に使用して、不要な出力を取り除くようにします。また、Content-TypeやContent-Dispositionのファイル名には、日本語などのマルチバイト文字を含める場合は、URLエンコードを考慮することも重要です。

Php
<?php // PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); // $objWriter->save('php://output'); の前に以下の行を追加すると安全 ob_end_clean(); // 以前のバッファリング内容をクリア ?>

まとめ

本記事では、PHPExcelライブラリを使ってExcelファイルを出力する際に、印刷時のページ方向をプログラムから設定する方法を解説しました。

  • PHPExcelのインストールから基本的なExcel出力までの流れ を確認しました。
  • getPageSetup() メソッドを通じて setOrientation() でページ方向(ORIENTATION_LANDSCAPE または ORIENTATION_PORTRAIT)を設定 しました。
  • 用紙サイズ、拡大縮小率、印刷範囲、余白など、その他の印刷設定 も柔軟に制御できることを紹介しました。

この記事を通して、Webアプリケーションから出力されるExcelファイルが、最初からユーザーのニーズに合った印刷設定(特にページ方向)で提供できるようになり、ユーザーエクスペリエンスが向上するというメリットを改めて実感いただけたのではないでしょうか。

今後は、PHPExcelの後継であるPhpSpreadsheetへの移行方法や、グラフの埋め込み、画像挿入といったさらに発展的なExcel操作についても記事にする予定です。

参考資料