Symfoware

Symfowareについての考察blog

PHPでexcel(xlsx)ファイルをPhpSpreadsheet + CodeIgniter 3で出力

PHPでxlsx形式のファイルを出力してみます。

こちらを参考に
PHPExcelの後継っぽいPhpSpreadsheetでExcelファイルを読み書きするサンプルコード
PhpSpreadsheetを使用します。

https://github.com/PHPOffice/PhpSpreadsheet
https://phpspreadsheet.readthedocs.io/en/develop/


CodeIgniter 3を使用して出力を試してみたいと思います。



composerでの取得



composerで取得したライブラリをCodeIgniterで使用する方法。
CodeIgniter 3でComposer(コンポーザー)のautoload

こちらを思い出しながら、PhpSpreadsheetの設置を行います。

まず、CodeIgniterのapplicationディレクトリ内にcomposer.jsonファイルを作成。

記載する内容は以下の通り。

・composer.json


  1. {
  2.     "require": {
  3.         "phpoffice/phpspreadsheet": "dev-develop"
  4.     }
  5. }




開発版を使用することにしました。

applicationディレクトリでcomposerコマンドを実行。


$ composer install



これでapplication/vendorディレクトリにPhpSpreadsheetと必要なライブラリが配置されます。



CodeIgniterでcomposerのautoloadを有効にするため、
application/config/config.phpを編集。

composer_autoloadをTRUEに変更します。


  1. $config['composer_autoload'] = TRUE;



これで準備は整いました。





hello world



とにかくxlsxファイルを出力してみます。
application/controllers/Sample.phpを作成。


・Sample.php


  1. <?php
  2. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  3. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  4. class Sample extends CI_Controller {
  5.     public function index() {
  6.         
  7.         $spreadsheet = new Spreadsheet();
  8.         $sheet = $spreadsheet->getActiveSheet();
  9.         $sheet->setCellValue('A1', 'Hello World !');
  10.         
  11.         $writer = new Xlsx($spreadsheet);
  12.         $writer->save('hello world.xlsx');
  13.         
  14.     }
  15. }




CodeIgniterのルートディレクトリ(index.phpがある階層)に移動し、
コマンドで実行してやります。


$ php index.php sample




「hello world.xlsx」が出力できました。

799_01.png



日本語を出力してみます。


  1. <?php
  2. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  3. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  4. class Sample extends CI_Controller {
  5.     public function index() {
  6.         
  7.         $spreadsheet = new Spreadsheet();
  8.         $sheet = $spreadsheet->getActiveSheet();
  9.         $sheet->setCellValue('A1', '日本語でこんにちは!');
  10.         
  11.         $writer = new Xlsx($spreadsheet);
  12.         $writer->save('hello world.xlsx');
  13.         
  14.     }
  15. }




特に問題なさそうです。

799_02.png


改行もOK


  1. <?php
  2. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  3. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  4. class Sample extends CI_Controller {
  5.     public function index() {
  6.         
  7.         $spreadsheet = new Spreadsheet();
  8.         $sheet = $spreadsheet->getActiveSheet();
  9.         $sheet->setCellValue('A1', "日本語でこんにちは!\n改行");
  10.         
  11.         $writer = new Xlsx($spreadsheet);
  12.         $writer->save('hello world.xlsx');
  13.         
  14.     }
  15. }



799_03.png






罫線



罫線の設定はサンプルの「23_Sharedstyles.php」が参考になります。


  1. <?php
  2. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  3. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  4. use PhpOffice\PhpSpreadsheet\Style;
  5. use PhpOffice\PhpSpreadsheet\Style\Border;
  6. class Sample extends CI_Controller {
  7.     public function index() {
  8.         
  9.         $spreadsheet = new Spreadsheet();
  10.         $sheet = $spreadsheet->getActiveSheet();
  11.         
  12.         // スタイルを指定
  13.         $sharedStyle = new Style();
  14.         $sharedStyle->applyFromArray([
  15.             'borders' => [
  16.                 'bottom' => ['borderStyle' => Border::BORDER_THIN],
  17.                 'right' => ['borderStyle' => Border::BORDER_MEDIUM],
  18.             ]
  19.         ]);
  20.         
  21.         // セルの範囲を指定して、スタイルを反映
  22.         $spreadsheet->getActiveSheet()->duplicateStyle($sharedStyle, 'A1:E1');
  23.         
  24.         $writer = new Xlsx($spreadsheet);
  25.         $writer->save('hello world.xlsx');
  26.         
  27.     }
  28. }



799_04.png


指定可能な線のスタイルは以下のとおり。


Border::BORDER_NONE
Border::BORDER_DASHDOT
Border::BORDER_DASHDOTDOT
Border::BORDER_DASHED
Border::BORDER_DOTTED
Border::BORDER_DOUBLE
Border::BORDER_HAIR
Border::BORDER_MEDIUM
Border::BORDER_MEDIUMDASHDOT
Border::BORDER_MEDIUMDASHDOTDOT
Border::BORDER_MEDIUMDASHED
Border::BORDER_SLANTDASHDOT
Border::BORDER_THICK
Border::BORDER_THIN



799_05.png




セルの色



セルに色を付けたい場合も罫線と同様スタイルを指定してやります。


  1. <?php
  2. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  3. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  4. use PhpOffice\PhpSpreadsheet\Style;
  5. use PhpOffice\PhpSpreadsheet\Style\Border;
  6. use PhpOffice\PhpSpreadsheet\Style\Fill;
  7. class Sample extends CI_Controller {
  8.     public function index() {
  9.         
  10.         $spreadsheet = new Spreadsheet();
  11.         $sheet = $spreadsheet->getActiveSheet();
  12.         
  13.         // スタイルを指定
  14.         $sharedStyle = new Style();
  15.         $sharedStyle->applyFromArray([
  16.             'fill' => [
  17.                 'fillType' => Fill::FILL_SOLID,
  18.                 'color' => ['argb' => 'FFCCFFCC'],
  19.             ]
  20.         ]);
  21.         
  22.         // セルの範囲を指定して、スタイルを反映
  23.         $spreadsheet->getActiveSheet()->duplicateStyle($sharedStyle, 'A1:E1');
  24.         
  25.         $writer = new Xlsx($spreadsheet);
  26.         $writer->save('hello world.xlsx');
  27.         
  28.     }
  29. }



799_06.png



Fillで指定できるのは以下の通り。


Fill::FILL_NONE
Fill::FILL_SOLID
Fill::FILL_GRADIENT_LINEAR
Fill::FILL_GRADIENT_PATH
Fill::FILL_PATTERN_DARKDOWN
Fill::FILL_PATTERN_DARKGRAY
Fill::FILL_PATTERN_DARKGRID
Fill::FILL_PATTERN_DARKHORIZONTAL
Fill::FILL_PATTERN_DARKTRELLIS
Fill::FILL_PATTERN_DARKUP
Fill::FILL_PATTERN_DARKVERTICAL
Fill::FILL_PATTERN_GRAY0625
Fill::FILL_PATTERN_GRAY125
Fill::FILL_PATTERN_LIGHTDOWN
Fill::FILL_PATTERN_LIGHTGRAY
Fill::FILL_PATTERN_LIGHTGRID
Fill::FILL_PATTERN_LIGHTHORIZONTAL
Fill::FILL_PATTERN_LIGHTTRELLIS
Fill::FILL_PATTERN_LIGHTUP
Fill::FILL_PATTERN_LIGHTVERTICAL
Fill::FILL_PATTERN_MEDIUMGRAY




色を指定した場合、差異はないようです。

799_07.png


色を指定しなかった場合、このようになりました。

799_08.png



罫線と色を同時に指定することも可能です。


  1. <?php
  2. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  3. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  4. use PhpOffice\PhpSpreadsheet\Style;
  5. use PhpOffice\PhpSpreadsheet\Style\Border;
  6. use PhpOffice\PhpSpreadsheet\Style\Fill;
  7. class Sample extends CI_Controller {
  8.     public function index() {
  9.         
  10.         $spreadsheet = new Spreadsheet();
  11.         $sheet = $spreadsheet->getActiveSheet();
  12.         
  13.         // スタイルを指定
  14.         $sharedStyle = new Style();
  15.         $sharedStyle->applyFromArray([
  16.             'fill' => [
  17.                 'fillType' => Fill::FILL_SOLID,
  18.                 'color' => ['argb' => 'FFCCFFCC'],
  19.             ],
  20.             'borders' => [
  21.                 'bottom' => ['borderStyle' => Border::BORDER_THIN],
  22.                 'right' => ['borderStyle' => Border::BORDER_MEDIUM],
  23.             ]
  24.         ]);
  25.         
  26.         // セルの範囲を指定して、スタイルを反映
  27.         $spreadsheet->getActiveSheet()->duplicateStyle($sharedStyle, 'A1:E1');
  28.         
  29.         $writer = new Xlsx($spreadsheet);
  30.         $writer->save('hello world.xlsx');
  31.         
  32.     }
  33. }




799_09.png




作成したファイルのダウンロード



ブラウザで表示した時、作成したファイルをダウンロードさせるパターン。
※サンプルのままですが。


  1. <?php
  2. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  3. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  4. use PhpOffice\PhpSpreadsheet\Style;
  5. use PhpOffice\PhpSpreadsheet\Style\Border;
  6. use PhpOffice\PhpSpreadsheet\Style\Fill;
  7. class Sample extends CI_Controller {
  8.     public function index() {
  9.         
  10.         $spreadsheet = new Spreadsheet();
  11.         $sheet = $spreadsheet->getActiveSheet();
  12.         
  13.         // スタイルを指定
  14.         $sharedStyle = new Style();
  15.         $sharedStyle->applyFromArray([
  16.             'fill' => [
  17.                 'fillType' => Fill::FILL_SOLID,
  18.                 'color' => ['argb' => 'FFCCFFCC'],
  19.             ],
  20.             'borders' => [
  21.                 'bottom' => ['borderStyle' => Border::BORDER_THIN],
  22.                 'right' => ['borderStyle' => Border::BORDER_MEDIUM],
  23.             ]
  24.         ]);
  25.         
  26.         // セルの範囲を指定して、スタイルを反映
  27.         $spreadsheet->getActiveSheet()->duplicateStyle($sharedStyle, 'A1:E1');
  28.         
  29.         $writer = new Xlsx($spreadsheet);
  30.         //$writer->save('hello world.xlsx');
  31.         
  32.         // Redirect output to a client’s web browser (Xlsx)
  33.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  34.         header('Content-Disposition: attachment;filename="01simple.xlsx"');
  35.         header('Cache-Control: max-age=0');
  36.         // If you're serving to IE 9, then the following may be needed
  37.         header('Cache-Control: max-age=1');
  38.         // If you're serving to IE over SSL, then the following may be needed
  39.         header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  40.         header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
  41.         header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  42.         header('Pragma: public'); // HTTP/1.0
  43.         
  44.         $writer->save('php://output');
  45.         exit;
  46.         
  47.     }
  48. }



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/09/21(木) 00:09:01|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ