忍者ブログ

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

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

PHP PhpSpreadsheet エクセルのワークシートの処理について


今回は Spreadsheet で行う 「ワークシートの扱い方」 について説明したいと思います。




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');



■新規 ワークシート の追加処理(createSheetaddSheet

新規の ワークシート をブック(Spreadsheetオブジェクト)に追加する場合には createSheetaddSheet のメソッドを使います。
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])の前に追加されます。



ワークシート のコピー処理(cloneaddSheetaddExternalSheet

ワークブックの中のコピーしたいワークシートのクローンを生成し、そのオブジェクトをワークブックに追加することでコピー処理となります。 ワークブックへの追加は 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

コメント

コメントを書く