In PhpSpreadsheet, the object hierarchy mirrors the structure of desktop spreadsheet applications:
Spreadsheet (Workbook) - The top-level container
Worksheet (Sheet/Tab) - Individual sheets within the workbook
Cell - Individual data cells within a worksheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;$spreadsheet = new Spreadsheet(); // The workbook$worksheet = $spreadsheet->getActiveSheet(); // A sheet$cell = $worksheet->getCell('A1'); // A cell
// Set active sheet by index$spreadsheet->setActiveSheetIndex(1);// Set active sheet by name$spreadsheet->setActiveSheetIndexByName('Summary');// Verify active sheet$activeIndex = $spreadsheet->getActiveSheetIndex();
// Add a new sheet as the last sheet$newSheet = $spreadsheet->createSheet();// Automatically named 'Worksheet1', 'Worksheet2', etc.// Add a new sheet at a specific position$newSheet = $spreadsheet->createSheet(1);// Inserts at index 1, shifts subsequent sheets
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;// Create a new worksheet with a custom title$mySheet = new Worksheet($spreadsheet, 'Sales Data');// Add it to the workbook$spreadsheet->addSheet($mySheet, 0); // Add as first sheet// Or add as last sheet$spreadsheet->addSheet($mySheet);
Unique Names Required: Worksheet names must be unique within a workbook. PhpSpreadsheet will throw an exception if you try to create a worksheet with a duplicate name.
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;// Visible (default)$sheet->setSheetState(Worksheet::SHEETSTATE_VISIBLE);// Hidden (user can unhide via Excel UI)$sheet->setSheetState(Worksheet::SHEETSTATE_HIDDEN);// Very Hidden (cannot unhide via UI, only programmatically)$sheet->setSheetState(Worksheet::SHEETSTATE_VERYHIDDEN);// Check sheet state$state = $sheet->getSheetState();
use PhpOffice\PhpSpreadsheet\Style\Color;// Set tab color$sheet->getTabColor()->setRGB('FF0000'); // Red// Or use named colors$sheet->getTabColor()->setRGB(Color::COLOR_BLUE);
// Clone an existing worksheet$clonedSheet = clone $spreadsheet->getSheetByName('Template');// Set a unique title$clonedSheet->setTitle('Copy of Template');// Add to workbook$spreadsheet->addSheet($clonedSheet);
Copying worksheets between workbooks is more complex as styles must also be replicated:
// Clone the worksheet$clonedSheet = clone $spreadsheet1->getSheetByName('Data');// Add to the target workbook with external sheet support$spreadsheet2->addExternalSheet($clonedSheet);
// Get the sheet index$sheetIndex = $spreadsheet->getIndex( $spreadsheet->getSheetByName('Temporary Data'));// Remove the worksheet$spreadsheet->removeSheetByIndex($sheetIndex);
Active Sheet Management: If you delete the currently active worksheet, the sheet at the previous index position will automatically become the active sheet.
You can change the order of worksheets in the workbook:
// Get a worksheet$sheet = $spreadsheet->getSheetByName('Summary');// Get its current index$currentIndex = $spreadsheet->getIndex($sheet);// Remove from current position$spreadsheet->removeSheetByIndex($currentIndex);// Add at new position$spreadsheet->addSheet($sheet, 0); // Move to first position
foreach ($spreadsheet->getSheetNames() as $sheetName) { $sheet = $spreadsheet->getSheetByName($sheetName); echo "Processing sheet: {$sheetName}\n"; // Work with the sheet}
for ($i = 0; $i < $spreadsheet->getSheetCount(); $i++) { $sheet = $spreadsheet->getSheet($i); echo "Processing sheet at index {$i}: " . $sheet->getTitle() . "\n"; // Work with the sheet}
use PhpOffice\PhpSpreadsheet\Worksheet\Iterator;$iterator = new Iterator($spreadsheet);foreach ($iterator as $worksheet) { echo "Sheet: " . $worksheet->getTitle() . "\n"; // Work with each worksheet}
use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;$spreadsheet = new Spreadsheet();// Configure the default sheet$summarySheet = $spreadsheet->getActiveSheet();$summarySheet->setTitle('Summary');$summarySheet->setCellValue('A1', 'Annual Report Summary');// Create additional sheets$q1Sheet = new Worksheet($spreadsheet, 'Q1 Data');$spreadsheet->addSheet($q1Sheet);$q2Sheet = new Worksheet($spreadsheet, 'Q2 Data');$spreadsheet->addSheet($q2Sheet);$q3Sheet = new Worksheet($spreadsheet, 'Q3 Data');$spreadsheet->addSheet($q3Sheet);$q4Sheet = new Worksheet($spreadsheet, 'Q4 Data');$spreadsheet->addSheet($q4Sheet);// Set summary sheet as active$spreadsheet->setActiveSheetIndexByName('Summary');
// Load a template workbook$spreadsheet = IOFactory::load('template.xlsx');// Get the template sheet$template = $spreadsheet->getSheetByName('Template');// Hide the template$template->setSheetState(Worksheet::SHEETSTATE_VERYHIDDEN);// Create copies for each month$months = ['January', 'February', 'March'];foreach ($months as $month) { $monthSheet = clone $template; $monthSheet->setTitle($month); $monthSheet->setSheetState(Worksheet::SHEETSTATE_VISIBLE); $monthSheet->setCellValue('A1', "Report for {$month}"); $spreadsheet->addSheet($monthSheet);}