忍者ブログ

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

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

PHP PhpSpreadsheet CSVファイルの読み込み・書き込みについて


今回は 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でのシステム開発を学べる入門書です。

share











PR

コメント

コメントを書く