Creating a Basic Spreadsheet
Creating a new spreadsheet with PhpSpreadsheet is straightforward:<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
require 'vendor/autoload.php';
// Create new Spreadsheet object
$spreadsheet = new Spreadsheet();
// Set document properties
$spreadsheet->getProperties()
->setCreator('Your Name')
->setLastModifiedBy('Your Name')
->setTitle('PhpSpreadsheet Document')
->setSubject('Sample Document')
->setDescription('Document created with PhpSpreadsheet')
->setKeywords('office phpspreadsheet php')
->setCategory('Reports');
// Add data to the active sheet
$spreadsheet->getActiveSheet()
->setCellValue('A1', 'Hello')
->setCellValue('B2', 'World!');
// Save the file
$writer = new Xlsx($spreadsheet);
$writer->save('new_spreadsheet.xlsx');
Creating Multiple Worksheets
You can create spreadsheets with multiple worksheets:<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
require 'vendor/autoload.php';
$spreadsheet = new Spreadsheet();
// Work with the first sheet (automatically created)
$sheet1 = $spreadsheet->getActiveSheet();
$sheet1->setTitle('Sales Data');
$sheet1->setCellValue('A1', 'Product');
$sheet1->setCellValue('B1', 'Revenue');
$sheet1->setCellValue('A2', 'Widget A');
$sheet1->setCellValue('B2', 1000);
$sheet1->setCellValue('A3', 'Widget B');
$sheet1->setCellValue('B3', 1500);
// Create a second sheet
$sheet2 = $spreadsheet->createSheet();
$sheet2->setTitle('Expenses');
$sheet2->setCellValue('A1', 'Category');
$sheet2->setCellValue('B1', 'Amount');
$sheet2->setCellValue('A2', 'Marketing');
$sheet2->setCellValue('B2', 500);
$sheet2->setCellValue('A3', 'Operations');
$sheet2->setCellValue('B3', 750);
// Create a third sheet
$sheet3 = $spreadsheet->createSheet();
$sheet3->setTitle('Summary');
$sheet3->setCellValue('A1', 'Total Revenue');
$sheet3->setCellValue('B1', '=\'Sales Data\'!B2+\'Sales Data\'!B3');
$sheet3->setCellValue('A2', 'Total Expenses');
$sheet3->setCellValue('B2', '=Expenses!B2+Expenses!B3');
$sheet3->setCellValue('A3', 'Net Profit');
$sheet3->setCellValue('B3', '=B1-B2');
// Set the first sheet as active
$spreadsheet->setActiveSheetIndex(0);
$writer = new Xlsx($spreadsheet);
$writer->save('multi_sheet.xlsx');
Cloning Worksheets
You can clone an existing worksheet to create a copy:<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
require 'vendor/autoload.php';
$spreadsheet = new Spreadsheet();
// Set up the first sheet
$spreadsheet->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B2', 'world!')
->setCellValue('C1', 'Hello')
->setCellValue('D2', 'world!');
$spreadsheet->getActiveSheet()->setTitle('Original');
// Clone the worksheet
$clonedSheet = clone $spreadsheet->getActiveSheet();
// Modify the cloned sheet
$clonedSheet
->setCellValue('A1', 'Goodbye')
->setCellValue('A2', 'cruel')
->setCellValue('C1', 'Goodbye')
->setCellValue('C2', 'cruel');
// Rename and add the cloned sheet
$clonedSheet->setTitle('Modified Copy');
$spreadsheet->addSheet($clonedSheet);
$writer = new Xlsx($spreadsheet);
$writer->save('cloned_sheets.xlsx');
Setting Column Widths and Row Heights
<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
require 'vendor/autoload.php';
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Add some data
$sheet->setCellValue('A1', 'Name');
$sheet->setCellValue('B1', 'Description');
$sheet->setCellValue('C1', 'Price');
$sheet->setCellValue('A2', 'Product 1');
$sheet->setCellValue('B2', 'This is a longer description of the product');
$sheet->setCellValue('C2', 19.99);
// Set column widths
$sheet->getColumnDimension('A')->setWidth(15);
$sheet->getColumnDimension('B')->setWidth(50);
$sheet->getColumnDimension('C')->setWidth(12);
// Set auto-width for a column
$sheet->getColumnDimension('A')->setAutoSize(true);
// Set row height
$sheet->getRowDimension(1)->setRowHeight(25);
// Set auto-height (especially useful for wrapped text)
$sheet->getRowDimension(2)->setRowHeight(-1);
$writer = new Xlsx($spreadsheet);
$writer->save('formatted_dimensions.xlsx');
Adding Bulk Data
For adding multiple rows of data efficiently:<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
require 'vendor/autoload.php';
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Sample data array
$data = [
['Name', 'Email', 'Phone', 'City'],
['John Doe', '[email protected]', '555-0100', 'New York'],
['Jane Smith', '[email protected]', '555-0101', 'Los Angeles'],
['Bob Johnson', '[email protected]', '555-0102', 'Chicago'],
['Alice Brown', '[email protected]', '555-0103', 'Houston'],
];
// Insert data starting from cell A1
$sheet->fromArray($data, null, 'A1');
// Or insert row by row
$rowNumber = 1;
foreach ($data as $row) {
$columnLetter = 'A';
foreach ($row as $value) {
$sheet->setCellValue($columnLetter . $rowNumber, $value);
$columnLetter++;
}
$rowNumber++;
}
$writer = new Xlsx($spreadsheet);
$writer->save('bulk_data.xlsx');
Working with Different File Formats
<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
// ... add data ...
$writer = new Xlsx($spreadsheet);
$writer->save('file.xlsx');
Key Takeaways
- Use
new Spreadsheet()to create a new spreadsheet with one default worksheet - Set document properties using
getProperties()for better file metadata - Create additional sheets with
createSheet()or clone existing sheets - Use
fromArray()for bulk data insertion - Set column widths and row heights with dimension methods
- Choose the appropriate writer class for your desired output format

