今回は PhpSpreadsheet でCSVファイルの「読み込み」及び「書き込み」について説明したいと思います。
CSVファイルはカンマで区切られたテキストファイルで、他のシステムからのデータの取り込みや、ユーザに対してのデータの提供などでよく使われます。
「読み込み」及び「書き込み」に対応したクラス「PhpOffice\PhpSpreadsheet\Reader\Csv」「PhpOffice\PhpSpreadsheet\Writer\Csv」がありますので、これらを使って処理を行います。
本の紹介では...
PHP8の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得。
PHPプログラミングの標準教科書『独習PHP』が、最新のPHP8に対応。
PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、
PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
...
■CSVファイルの「読み込み」(読込後、新規にエクセル書込み)
CSVファイルの「読み込み」を行うには PhpOffice\PhpSpreadsheet\Reader\Csv クラスを使います。
PhpOffice\PhpSpreadsheet\Reader\Csv クラスを生成し setInputEncoding メソッドで 文字コード を設定します。
更に setDelimiter メソッドで 区切り記号 を設定し setEnclosure メソッドで 囲み文字 を設定します。
最後に load メソッドで CSVファイルを読み込み PhpSpreadsheetオブジェクト を生成します。
この PhpSpreadsheetオブジェクト を出力することでエクセルファイルに出力できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php // ライブラリ読込 require '../vendor/autoload.php' ; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Reader\Csv; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // CSV読込クラス生成 $objReader = new Csv(); // CSVファイルの文字コード:Shift-JIS $objReader ->setInputEncoding( 'SJIS' ); // 区切り記号(カンマ) $objReader ->setDelimiter( ',' ); // 文字列の囲み文字(") $objReader ->setEnclosure( '"' ); // シートの位置 $objReader ->setSheetIndex(0); // 読込の結果としてPhpSpreadsheetオブジェクトが返る $objSpreadsheet = $objReader ->load( "test10.csv" ); // [test10-1.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx( $objSpreadsheet ); $objWriter ->save( 'test10-1.xlsx' ); exit (); ?> |
出力されたエクセルファイルを見てみると以下の様になります。
「test10.csv」の内容は以下の通りです。
1 2 3 | "AAAAAAA" , "BBB" , "CCC" "aaaa" , "bbb" , "ccc" "ああああ" , "いいい" , "漢字データ" |
■CSVファイルの「読み込み」(読込後、既存エクセルに追加し書込み)
既に存在するエクセルファイルを読込んでおき、CSVファイルの「読み込み」を行ったシートデータをエクセルデータに追加する方法を説明します。
手順としては、最初に IOFactory::load() メソッドで既存エクセルファイルを読込みます。
その後は、上記の例の様に Reader\Csv クラスを生成し、CSVのオプションを設定し loadIntoExisting() メソッドでPhpSpreadsheetオブジェクトに追加します。
ここで注意するのは setSheetIndex() メソッドで、シートの位置が任意に指定できることです。
今回は「2」としますので、結果のエクセルファイルには3番目のシートとして生成されます。
また、PhpSpreadsheetオブジェクトに追加する時に2番目のシートは存在しないので、空のシートが生成されます。
後はPhpSpreadsheetオブジェクトを別名のエクセルファイルで書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php // ライブラリ読込 require '../vendor/autoload.php' ; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Reader\Csv; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // [test10-1.xlsx] ファイルをロードしSpreadsheetオブジェクト作成 $objSpreadsheet = IOFactory::load( './test10-1.xlsx' ); // CSV読込クラス生成 $objReader = new Csv(); // CSVファイルの文字コード:Shift-JIS $objReader ->setInputEncoding( 'SJIS' ); // 区切り記号(カンマ) $objReader ->setDelimiter( ',' ); // 文字列の囲み文字(") $objReader ->setEnclosure( '"' ); // シートの位置 $objReader ->setSheetIndex(2); // 読込の結果をSpreadsheetオブジェクトに追加する $objReader ->loadIntoExisting( "test10.csv" , $objSpreadsheet ); // [test10-2.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx( $objSpreadsheet ); $objWriter ->save( 'test10-2.xlsx' ); ?> |
出力されたエクセルファイルを見てみると以下の様になります。
「Worksheet 2」「Worksheet 3」のシートが追加されています。 「Worksheet 2」は全てが空白のシートで、「Worksheet 3」は今回追加したシートです。
尚、シートの位置指定で以下の様に既存のシートの場所にすると、その場所に上書きされる様です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php // ライブラリ読込 require '../vendor/autoload.php' ; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Reader\Csv; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // [test10-1.xlsx] ファイルをロードしSpreadsheetオブジェクト作成 $objSpreadsheet = IOFactory::load( './test10-1.xlsx' ); // CSV読込クラス生成 $objReader = new Csv(); // CSVファイルの文字コード:Shift-JIS $objReader ->setInputEncoding( 'SJIS' ); // 区切り記号(カンマ) $objReader ->setDelimiter( ',' ); // 文字列の囲み文字(") $objReader ->setEnclosure( '"' ); // シートの位置 $objReader ->setSheetIndex(0); // 読込の結果をSpreadsheetオブジェクトに追加する $objReader ->loadIntoExisting( "test10-1.csv" , $objSpreadsheet ); // [test10-2-1.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx( $objSpreadsheet ); $objWriter ->save( 'test10-2-1.xlsx' ); ?> |
「test10-1.csv」の内容
1 2 | "a11" , "b22" "いいい" , "漢字データ" |
出力されたエクセルファイルを見てみると以下の様になります。
■CSVファイルの「書き込み」
CSVファイルの「書き込み」を行うには PhpOffice\PhpSpreadsheet\Writer\Csv クラスを使います。
PhpSpreadsheetオブジェクト を引数にして PhpOffice\PhpSpreadsheet\Writer\Csv クラスを生成します。
setDelimiter メソッドで 区切り記号 を setEnclosure メソッドで 囲み文字 を setLineEnding メソッドで 改行コード を設定します。
また setUseBOM メソッドで「UTF-8」ファイルとしての「BOM」ファイルヘッダを出力する指定をします。
さらに setSheetIndex メソッドで出力するシート位置を指定します。
最後に save メソッドで CSVファイルを書込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php // ライブラリ読込 require '../vendor/autoload.php' ; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Writer\Csv; // [test10-1.xlsx] ファイルをロードしSpreadsheetオブジェクト作成 $objSpreadsheet = IOFactory::load( './test10-1.xlsx' ); // CSV書込クラス生成 $objWriter = new Csv( $objSpreadsheet ); // 区切り記号(カンマ) $objWriter ->setDelimiter( ',' ); // 文字列の囲み文字(") $objWriter ->setEnclosure( '"' ); // 改行コード $objWriter ->setLineEnding( "\r\n" ); // 「UTF-8」ファイルとしての「BOM」ファイルヘッダ $objWriter ->setUseBOM(true); // シートの位置 $objWriter ->setSheetIndex(0); // 書込み処理 $objWriter ->save( "test10-3.csv" ); exit (); ?> |
出力されたCSVファイル「test10-3.csv」は以下の様になります。
1 2 3 | "AAAAAAA" , "BBB" , "CCC" "aaaa" , "bbb" , "ccc" "ああああ" , "いいい" , "漢字データ" |
生成されるCSVファイルは「UTF-8」のコードですが、「BOM」ファイルヘッダが在るため、エクセルでもそのまま開くことが出来ます。
関連する記事
⇒PHP PhpSpreadsheet エクセルのワークシートのセルへのアクセスについて⇒PHP PhpSpreadsheet エクセルのワークシートのセルへ漢字(全角文字)の設定について
⇒PHP PhpSpreadsheet エクセルのワークシートのセルへのアクセスについて(行・列指定)
⇒PHP PhpSpreadsheet エクセルのワークシートのセルのスタイル設定について
⇒PHP PhpSpreadsheet エクセルのワークシートのセルの条件付き書式設定について
⇒PHP PhpSpreadsheet エクセルのワークシートのセルのデータ入力規則設定について
⇒PHP PhpSpreadsheet エクセルのワークシートの紙の大きさやページ設定について
⇒PHP PhpSpreadsheet CSVファイルの読み込み・書き込みについて
⇒PHP PhpSpreadsheet エクセルファイルをPHPの配列データへの読み込みについて(rangeToArray)
ショッピングサイト一通りを最初から自分で作ってみることで、PHPでのシステム開発を学べる入門書です。
コメント