Skip to main content
This guide will walk you through creating, reading, and manipulating spreadsheets using PhpSpreadsheet.

Prerequisites

Before starting, make sure you have installed PhpSpreadsheet via Composer.

Create your first spreadsheet

Let’s create a simple spreadsheet with some data and save it as an Excel file.
1

Create a new PHP file

Create a file called create-spreadsheet.php in your project directory.
2

Add the basic code

create-spreadsheet.php
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// Create new Spreadsheet object
$spreadsheet = new Spreadsheet();

// Set document properties
$spreadsheet->getProperties()
    ->setCreator('Your Name')
    ->setTitle('My First Spreadsheet')
    ->setSubject('PhpSpreadsheet Test')
    ->setDescription('Test document for PhpSpreadsheet');

// Add data to cells
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello')
      ->setCellValue('B2', 'World!');

// Rename worksheet
$sheet->setTitle('My First Sheet');

// Save to file
$writer = new Xlsx($spreadsheet);
$writer->save('hello-world.xlsx');

echo "Spreadsheet created successfully!\n";
3

Run the script

php create-spreadsheet.php
This will create a file named hello-world.xlsx in your current directory.

Read an existing spreadsheet

Now let’s read data from an existing Excel file.
read-spreadsheet.php
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;

// Load existing file
$spreadsheet = IOFactory::load('hello-world.xlsx');

// Get active sheet
$sheet = $spreadsheet->getActiveSheet();

// Read cell values
echo "A1: " . $sheet->getCell('A1')->getValue() . "\n";
echo "B2: " . $sheet->getCell('B2')->getValue() . "\n";

// Get all data as array
$data = $sheet->toArray(null, true, true, true);
print_r($data);
IOFactory::load() automatically detects the file format (Excel, CSV, ODS, etc.) and uses the appropriate reader.

Working with different data types

PhpSpreadsheet supports various data types including strings, numbers, booleans, dates, and rich text.
data-types.php
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// String
$sheet->setCellValue('A1', 'Product Name')
      ->setCellValue('B1', 'Widget');

// Number
$sheet->setCellValue('A2', 'Price')
      ->setCellValue('B2', 29.99);

// Integer
$sheet->setCellValue('A3', 'Quantity')
      ->setCellValue('B3', 42);

// Boolean
$sheet->setCellValue('A4', 'In Stock')
      ->setCellValue('B4', true);

// Date
$sheet->setCellValue('A5', 'Order Date')
      ->setCellValue('B5', Date::PHPToExcel(time()));
$sheet->getStyle('B5')
      ->getNumberFormat()
      ->setFormatCode(NumberFormat::FORMAT_DATE_YYYYMMDD);

// Formula
$sheet->setCellValue('A6', 'Total')
      ->setCellValue('B6', '=B2*B3');

$writer = new Xlsx($spreadsheet);
$writer->save('data-types.xlsx');

echo "Spreadsheet with various data types created!\n";

Basic formatting

Add styling to make your spreadsheet more readable.
formatting.php
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Alignment;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// Add header row
$sheet->setCellValue('A1', 'Name')
      ->setCellValue('B1', 'Email')
      ->setCellValue('C1', 'Status');

// Style the header
$headerStyle = $sheet->getStyle('A1:C1');
$headerStyle->getFont()->setBold(true)->setSize(12);
$headerStyle->getFill()
    ->setFillType(Fill::FILL_SOLID)
    ->getStartColor()->setARGB('FF4CAF50');
$headerStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);

// Add data
$sheet->setCellValue('A2', 'John Doe')
      ->setCellValue('B2', '[email protected]')
      ->setCellValue('C2', 'Active');

// Auto-size columns
$sheet->getColumnDimension('A')->setAutoSize(true);
$sheet->getColumnDimension('B')->setAutoSize(true);
$sheet->getColumnDimension('C')->setAutoSize(true);

$writer = new Xlsx($spreadsheet);
$writer->save('formatted.xlsx');

echo "Formatted spreadsheet created!\n";

Save to different formats

PhpSpreadsheet can export to multiple formats.
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$writer = new Xlsx($spreadsheet);
$writer->save('output.xlsx');
PDF export requires installing an additional library. See the installation guide for details.

Working with multiple sheets

Create and manage multiple worksheets in a single workbook.
multiple-sheets.php
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();

// First sheet
$sheet1 = $spreadsheet->getActiveSheet();
$sheet1->setTitle('Sales');
$sheet1->setCellValue('A1', 'Q1 Sales');
$sheet1->setCellValue('A2', 1000);

// Create second sheet
$sheet2 = $spreadsheet->createSheet();
$sheet2->setTitle('Expenses');
$sheet2->setCellValue('A1', 'Q1 Expenses');
$sheet2->setCellValue('A2', 500);

// Create third sheet
$sheet3 = $spreadsheet->createSheet();
$sheet3->setTitle('Summary');
$sheet3->setCellValue('A1', 'Profit');
$sheet3->setCellValue('A2', '=Sales!A2-Expenses!A2');

// Set first sheet as active
$spreadsheet->setActiveSheetIndex(0);

$writer = new Xlsx($spreadsheet);
$writer->save('multi-sheet.xlsx');

echo "Multi-sheet spreadsheet created!\n";

Common operations

Iterate through rows

$sheet = $spreadsheet->getActiveSheet();

foreach ($sheet->getRowIterator() as $row) {
    $cellIterator = $row->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(false);
    
    foreach ($cellIterator as $cell) {
        echo $cell->getValue() . " ";
    }
    echo "\n";
}

Get highest row and column

$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();

echo "Data range: A1:{$highestColumn}{$highestRow}\n";

Set column width

// Set specific width
$sheet->getColumnDimension('A')->setWidth(20);

// Auto-size
$sheet->getColumnDimension('B')->setAutoSize(true);

Set row height

// Set specific height
$sheet->getRowDimension(1)->setRowHeight(25);

// Auto-fit
$sheet->getRowDimension(2)->setRowHeight(-1);

Best practices

Memory management: When working with large spreadsheets, consider using read filters or processing data in chunks to minimize memory usage.
Dispose of objects: After saving, you can free memory by calling $spreadsheet->disconnectWorksheets();
Error handling: Always wrap file operations in try-catch blocks to handle potential errors gracefully.
try {
    $spreadsheet = IOFactory::load('file.xlsx');
    // Process spreadsheet
} catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) {
    echo "Error loading file: " . $e->getMessage();
}

Next steps

Now that you understand the basics, explore more advanced features:

Formulas

Work with Excel formulas and calculations

Styling

Advanced cell formatting and styles

Charts

Create and manipulate charts

API Reference

Detailed class and method documentation

Build docs developers (and LLMs) love