-
今回は Spreadsheet で行う 「ワークシートの扱い方」 について説明したいと思います。
- Spreadsheet オブジェクトの生成と ワークシート の取得
- 新規 ワークシート の追加処理(createSheet と addSheet)
- ワークシート のコピー処理(clone と addSheet、addExternalSheet )
- ワークシート の削除処理(removeSheetByIndex)
■Spreadsheet オブジェクトの生成と ワークシート の取得
Spreadsheet オブジェクトの生成を行うと1個の ワークシート ができているので、その ワークシート・オブジェクト を取得し、 そのオブジェクトの各種メソッドでセルなどに処理を行います。
getActiveSheet メソッドは現在のアクティブなワークシート返しますが Spreadsheet オブジェクトを生成直後は1個しかないシートがアクティブとして返されます。
以下のページと内容はほぼ同じですので、参照して下さい。
⇒PHP PhpSpreadsheet エクセルファイル出力の方法について
<?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); // XLSX形式オブジェクト生成 $objWriter = new Xlsx($objSpreadsheet); // ファイル書込み $objWriter->save('test.xlsx'); exit(); ?>getSheet メソッドは引数にワークシートの Index 指定を指定します。
ワークシートの Index ではなく名前で指定するには getSheetByName メソッドを使用します。// シート設定:ワークシートの Index 指定 $objSheet = $objBook->getSheet(0); // シート設定:ワークシートの名前指定 $objSheet = $objBook->getSheetByName('Worksheet');■新規 ワークシート の追加処理(createSheet と addSheet)
新規の ワークシート をブック(Spreadsheetオブジェクト)に追加する場合には createSheet と addSheet のメソッドを使います。
createSheet メソッドは引数の無い場合はシートの最後に追加されます。引数はシートの Index で指定された場合はその位置に挿入されます。
addSheet メソッドは指定されたシートオブジェクトを Index で指定された場合はその位置に挿入されます。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // シート追加 $objSpreadsheet->createSheet(); // シート追加:シート位置 Index 指定(Index = 0 :ブックの先頭) $objSpreadsheet->createSheet(0); // 新規ワークシートを生成 $objSheetMyData = new Worksheet($objSpreadsheet, 'MyData'); // [MyData]ワークシートをブックの先頭に追加 $objSpreadsheet->addSheet($objSheetMyData, 0); // XLSX形式オブジェクト生成 $objWriter = new Xlsx($objSpreadsheet); // ファイル書込み $objWriter->save('test2.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
このワークブックには必ず4個のワークシートが生成されています。
[Worksheet] は最初のPHPExcelオブジェクト作成後は必ず存在します。その後順番に以下の様になります。
(1) [Worksheet 1]はシートの最後に追加されます。
(2) [Worksheet 2]は先頭のシート([Worksheet])の前に追加されます。
(3) [MyData]は先頭のシート([Worksheet 2])の前に追加されます。
■ワークシート のコピー処理(clone と addSheet、addExternalSheet )
ワークブックの中のコピーしたいワークシートのクローンを生成し、そのオブジェクトをワークブックに追加することでコピー処理となります。 ワークブックへの追加は addSheet メソッドを使用します。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // シート設定 $objSheet = $objSpreadsheet->getActiveSheet(); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // [A2]セルに数値設定 $objSheet->setCellValue('A2', 123.56); // 0 番目のワークシート・オブジェクトのクローンを作成 $objCloneSheet = clone $objSpreadsheet->getSheet(0); // クローンワークシートのタイトル設定 $objCloneSheet->setTitle('Copy Worksheet 1'); // ワークブックへの追加 $objSpreadsheet->addSheet($objCloneSheet); // XLSX形式オブジェクト生成 $objWriter = new Xlsx($objSpreadsheet); // ファイル書込み $objWriter->save('test3.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
他のワークブックからのコピーを行う場合は、そのワークブックの該当するワークシートのクローンを生成し addExternalSheet メソッドで行います。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // [test3.xlsx] ファイルをロードしPhpSpreadsheetオブジェクト作成 $objSpreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('./test3.xlsx'); // 別のPhpSpreadsheetオブジェクト作成 $objSpreadsheetNew = new Spreadsheet(); // シート設定 $objSheetNew = $objSpreadsheetNew->getActiveSheet(); // [A1]セルに文字列設定 $objSheetNew->setCellValue('A1', 'abcdefghijklmn'); // [test3.xlsx]:[Copy Worksheet 1] シートのクローンを作成 $objCloneSheet = clone $objSpreadsheet->getSheetByName('Copy Worksheet 1'); // 別のワークブックへの追加 $objSpreadsheetNew->addExternalSheet($objCloneSheet); // 追加後の別のブックでのシート取得 $objSheet = $objSpreadsheetNew->getSheetByName('Copy Worksheet 1'); // クローンワークシートのタイトル設定 $objSheet->setTitle('New Worksheet 1'); // 別のブックでのXLSX形式オブジェクト生成 $objWriter = new Xlsx($objSpreadsheetNew); // ファイル書込み $objWriter->save('test3-1.xlsx'); exit(); ?>出力されたエクセルファイル[test3-1.xlsx]を見てみると以下の様になります。
■ワークシート の削除処理(removeSheetByIndex)
ワークブックからワークシートの削除を行うには、削除対象のワークシートの Index 番号を取得し removeSheetByIndex メソッドで行います。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // [test3-1.xlsx] ファイルをロードしPhpSpreadsheetオブジェクト作成 $objSpreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('./test3-1.xlsx'); // シート名 "Worksheet" シート設定 $objSheet = $objSpreadsheet->getSheetByName('Worksheet'); // シートオブジェクトから Index 取得 $intIndex = $objSpreadsheet->getIndex($objSheet); // Index によるシートオブジェクト削除 $objSpreadsheet->removeSheetByIndex($intIndex); // XLSX形式オブジェクト生成 $objWriter = new Xlsx($objSpreadsheet); // ファイル書込み $objWriter->save('test3-2.xlsx'); exit(); ?>出力されたエクセルファイル[test3-2.xlsx]を見てみると以下の様になります。[test3-1.xlsx] の先頭のシートが削除されているのがわかります。
PR -
今回は 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 でのダウンロードの表示は以下の通りです。
この方法は、テンプレートファイルを作成しておきクライアント側からの要求により対応するデータを設定し、 クライアントのブラウザに出力するといったことに使えると思います。
-
前回は以下の記事で composer のインストールまでを説明しましたが、今回はその続きで PhpSpreadsheet 本体のインストールについて説明したいと思います。
⇒PHP PhpSpreadsheet のインストールについて(XAMPPでのPhpSpreadsheetのインストールその1:composer)
■Composer によるバージョン指定
私のPCのPHPのバージョンは「5.6.28」なので、バージョンの指定を Composer で行います。
コマンドプロンプトを開いて以下のコマンドを実行します。composer config platform.php 5.6.28
なおこのコマンドを実行する前にディレクトリを PhpSpreadsheet をインストールしたい場所に変更します。
(私のPCではXAMPPなので「C:\xampp\htdocs」です。)
このコマンドの結果「composer.json」が作成されるはずです。{ "require": { }, "config": { "platform": { "php": "5.6.28" } } }■Composer による PhpSpreadsheet のインストール
上記のコマンドに引き続いて PhpSpreadsheet のインストールをするために以下のコマンドを実行します。
composer require phpoffice/phpspreadsheet
実際の実行結果は以下の様になります。
C:\xampp\htdocs>composer require phpoffice/phpspreadsheet Using version ^1.8 for phpoffice/phpspreadsheet ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 4 installs, 0 updates, 0 removals - Installing markbaker/matrix (1.2.0): Loading from cache - Installing markbaker/complex (1.4.8): Loading from cache - Installing psr/simple-cache (1.0.1): Loading from cache - Installing phpoffice/phpspreadsheet (1.8.2): Loading from cache phpoffice/phpspreadsheet suggests installing mpdf/mpdf (Option for rendering PDF with PDF Writer) phpoffice/phpspreadsheet suggests installing dompdf/dompdf (Option for rendering PDF with PDF Writer) phpoffice/phpspreadsheet suggests installing tecnickcom/tcpdf (Option for rendering PDF with PDF Writer) phpoffice/phpspreadsheet suggests installing jpgraph/jpgraph (Option for rendering charts, or including charts with PDF or HTML Writers) Writing lock file Generating autoload files
このコマンドの結果「composer.json」は以下の様になります。{ "require": { "phpoffice/phpspreadsheet": "^1.8" }, "config": { "platform": { "php": "5.6.28" } } }これで PhpSpreadsheet が利用できる様になりましたので、簡単な例を以下に示します。
■PhpSpreadsheet による簡単な例
それでは PhpSpreadsheet による簡単な例を示します。
以前の PHPExcel の場合とよく似ていますが、 最初に PhpSpreadsheet ライブラリの読み込みを行うため、 上記で PhpSpreadsheet のインストールしたディレクトリの中の「/vendor/autoload.php」をインクルードします。
尚、ソースが存在するディレクトリは PhpSpreadsheet のインストールしたディレクトリより1個階層が下なので「require '../vendor/autoload.php';」となります。
更に「use」キーワードでライブラリのクラス名のエイリアスを指定します。
あとのエクセルの処理は PHPExcel の以下の記事と似た感じで記述できます。
⇒PHP PHPExcel エクセルのワークシートのセルへのアクセスについて
<?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(); ?>出力されたエクセルファイルを見てみると以下の様になります。 (取敢えずエクセルファイルができた様です)
-
今回は PHPExcel の後継ライブラリである PhpSpreadsheet のインストールについて説明したいと思います。
PHPExcel のインストールの時はダウンロードしたZIPファイルを解凍して、任意のディレクトリに格納すればそれでよかったのですが、 PhpSpreadsheet では少し面倒なのですが Composer なるパッケージ管理ソフトを使います。
この Composer ですが XAMPP には存在しませんのでインストールする必要があります。
今回の記事は、先ずは Composer のインストールの手順について記します。
■Composer のダウンロード
Composer のダウンロードは以下のサイトから行えます。
composerのサイト(Windows)
⇒https://getcomposer.org/doc/00-intro.mdこのサイトの青くなっている Composer-Setup.exe リンクをクリックすると、 ダウンロードの開始を聞いてきますので「ファイルを保存」 をクリックしてダウンロードして下さい。
UNIXの場合は以下の記事が参考になると思います。
⇒PhpSpreadsheetのTIPSあれこれ
■Composer-Setup.exe の実行開始
ダウンロードした Composer-Setup.exe の実行開始すると以下の表示なります。
チェックオプションを入れることを推奨しているみたいなので、取り敢えずチェックをしました。
その後「Next >」ボタンをクリックしてインストールを開始します。
■インストール先のフォルダ指定
Composer をインストールするフォルダを指定します。
デフォルトで「c:\composer」と表示されますので、このままの設定で「Next >」ボタンをクリックします。■PHP のパス指定
PHP の実行プログラムのパスを指定をします。
XAMPP でのインストールのため、デフォルトで「c:\xampp\php\php.exe」と表示されますので、このままの設定で「Next >」ボタンをクリックします。
そうしますと、以下の様にチェック処理が走ります。■プロキシ設定
プロキシが必要であればここで設定を行います。
特に必要が無いので、このままの設定で「Next >」ボタンをクリックします。■インストールの実行前確認
インストールの実行する前の確認を行います。これで良ければ「Install」ボタンをクリックします。
■Composer のダウンロード処理中
Composer のダウンロードが開始されインストール中の表示です。
■インストール時の警告
私のPCのPHPのバージョンは「5.6.28」なので、バージョンアップしなさいとの警告が出てきました。
「OneDrive」は使用していないので特に問題無いと思いますので「Next >」ボタンをクリックします。The Windows OneDrive folder is not supported on PHP version below 7.2.23 and 7.3.10. Upgrade your PHP(5.6.28) to use this location with Composer.
■インストール完了
インストールが完了すると以下の表示が行われますので「Finish」ボタンをクリックします。
■Composer の確認
コマンドプロンプトを開いて「composer」を実行すると以下の様な表示がされるはずです。 これで Composer のインストールは終了しました。
-
今回は PHPExcel でCSVファイルの「読み込み」及び「書き込み」について説明したいと思います。
CSVファイルはカンマで区切られたテキストファイルで、他のシステムからのデータの取り込みや、ユーザに対してのデータの提供などでよく使われます。
「読み込み」及び「書き込み」に対応したクラス「PHPExcel_Reader_CSV」「PHPExcel_Writer_CSV」がありますので、これらを使って処理を行います。■CSVファイルの「読み込み」(読込後、新規にエクセル書込み)
CSVファイルの「読み込み」を行うには PHPExcel_Reader_CSV クラスを使います。
PHPExcel_Reader_CSV クラスを生成し setInputEncoding メソッドで 文字コード を設定します。
更に setDelimiter メソッドで 区切り記号 を設定し setEnclosure メソッドで 囲み文字 を設定します。
最後に load メソッドで CSVファイルを読み込み PHPExcelオブジェクト を生成します。
この PHPExcelオブジェクト を出力することでエクセルファイルに出力できます。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // CSV読込クラス生成 $objReader = new PHPExcel_Reader_CSV(); // CSVファイルの文字コード:Shift-JIS $objReader->setInputEncoding('SJIS'); // 区切り記号(カンマ) $objReader->setDelimiter(','); // 文字列の囲み文字(") $objReader->setEnclosure('"'); // シートの位置 $objReader->setSheetIndex(0); // 読込の結果としてPHPExcelオブジェクトが返る $objPHPExcel = $objReader->load("test10.csv"); // [test10-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('test10-1.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
「test10.csv」の内容は以下の通りです。"AAAAAAA","BBB","CCC" "aaaa","bbb","ccc" "ああああ","いいい","漢字データ"
■CSVファイルの「読み込み」(読込後、既存エクセルに追加し書込み)
既に存在するエクセルファイルを読込んでおき、CSVファイルの「読み込み」を行ったシートデータをエクセルデータに追加する方法を説明します。
手順としては、最初に PHPExcel_IOFactory::load() メソッドで既存エクセルファイルを読込みます。
その後は、上記の例の様に PHPExcel_Reader_CSV クラスを生成し、CSVのオプションを設定し loadIntoExisting() メソッドでPHPExcelオブジェクトに追加します。
ここで注意するのは setSheetIndex() メソッドで、シートの位置が任意に指定できることです。
今回は「2」としますので、結果のエクセルファイルには3番目のシートとして生成されます。
また、PHPExcelオブジェクトに追加する時に2番目のシートは存在しないので、空のシートが生成されます。
後はPHPExcelオブジェクトを別名のエクセルファイルで書き込みます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test10-1.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objPHPExcel = PHPExcel_IOFactory::load('./test10-1.xlsx'); // CSV読込クラス生成 $objReader = new PHPExcel_Reader_CSV(); // CSVファイルの文字コード:Shift-JIS $objReader->setInputEncoding('SJIS'); // 区切り記号(カンマ) $objReader->setDelimiter(','); // 文字列の囲み文字(") $objReader->setEnclosure('"'); // シートの位置 $objReader->setSheetIndex(2); // 読込の結果をPHPExcelオブジェクトに追加する $objReader->loadIntoExisting("test10.csv", $objPHPExcel); // [test10-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('test10-2.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
「Worksheet 2」「Worksheet 3」のシートが追加されています。 「Worksheet 2」は全てが空白のシートで、「Worksheet 3」は今回追加したシートです。
尚、シートの位置指定で以下の様に既存のシートの場所にすると、その場所に上書きされる様です。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test10-1.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objPHPExcel = PHPExcel_IOFactory::load('./test10-1.xlsx'); // CSV読込クラス生成 $objReader = new PHPExcel_Reader_CSV(); // CSVファイルの文字コード:Shift-JIS $objReader->setInputEncoding('SJIS'); // 区切り記号(カンマ) $objReader->setDelimiter(','); // 文字列の囲み文字(") $objReader->setEnclosure('"'); // シートの位置 $objReader->setSheetIndex(0); // 読込の結果をPHPExcelオブジェクトに追加する $objReader->loadIntoExisting("test10-1.csv", $objPHPExcel); // [test10-2-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('test10-2-1.xlsx'); exit(); ?>「test10-1.csv」の内容
"a11","b22" "いいい","漢字データ"
出力されたエクセルファイルを見てみると以下の様になります。
■CSVファイルの「書き込み」
CSVファイルの「書き込み」を行うには PHPExcel_Writer_CSV クラスを使います。
PHPExcelオブジェクト を引数にして PHPExcel_Writer_CSV クラスを生成します。
setDelimiter メソッドで 区切り記号 を setEnclosure メソッドで 囲み文字 を setLineEnding メソッドで 改行コード を設定します。
また setUseBOM メソッドで「UTF-8」ファイルとしての「BOM」ファイルヘッダを出力する指定をします。
さらに setSheetIndex メソッドで出力するシート位置を指定します。
最後に save メソッドで CSVファイルを書込みます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test10-1.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objPHPExcel = PHPExcel_IOFactory::load('./test10-1.xlsx'); // CSV書込クラス生成 $objWriter = new PHPExcel_Writer_CSV($objPHPExcel); // 区切り記号(カンマ) $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」は以下の様になります。
"AAAAAAA","BBB","CCC" "aaaa","bbb","ccc" "ああああ","いいい","漢字データ"
生成されるCSVファイルは「UTF-8」のコードですが、「BOM」ファイルヘッダが在るため、エクセルでもそのまま開くことが出来ます。