Files
PhpSpreadsheet/docs/index.md
T
oleibman d13f34b84e More Documentation Tweaks
Special handling in javascript and css for any image whose `alt` value starts with `Logo`, rather than targeting one specific value.

Remove 2 no-longer relevant statements from `extra.css`.

Add css member for `mkdocs` theme.

Add link to PhpSpreadsheet site to the bottom line of each page for `readthedocs` and `mkdocs` themes. In theory, these links should already exist, and they do locally, but not, for some reason, when run on readthedocs.io. This link is different from the `Edit on Github` link at the top, which is a kind of interesting feature.

Add a bookmarklet on the main page for toggling images to dark mode, which would probably be the preference for users employing dark mode. Images are usually left unchanged in dark mode, but almost all our images are screenshots, and dark mode might be appropriate for them.
2026-09-19 19:57:45 -07:00

10 KiB

Welcome to PhpSpreadsheet's documentation

Logo on White Background

PhpSpreadsheet is a library written in pure PHP and offers a set of classes that allow you to read and write various spreadsheet file formats such as Excel and LibreOffice Calc.

File formats supported

Format Reading Writing
Open Document Format/OASIS (.ods) ✓ ✓
Office Open XML (.xlsx) Excel 2007 and above ✓ ✓
BIFF 8 (.xls) Excel 97 and above ✓ ✓
BIFF 5 (.xls) Excel 95 ✓
SpreadsheetML (.xml) Excel 2003 ✓
Gnumeric ✓
HTML ✓ ✓
SYLK ✓
CSV ✓ ✓
PDF (using either the TCPDF, Dompdf or mPDF libraries, which need to be installed separately) ✓

Note - reading or writing certain aspects of a spreadsheet may not be supported in all formats. For more details, please consult Features Cross-reference.

Software requirements

PHP version 8.2 or newer to develop using PhpSpreadsheet. Other requirements, such as PHP extensions, are enforced by composer. See the require section of the composer.json file for details.

PHP version support

LTS: Support for PHP versions will only be maintained for a period of six months beyond the end of life of that PHP version.

Currently, the required PHP minimum version is PHP 8.2, and we will support that version until June 2027.

Support for PHP versions will only be maintained for a period of six months beyond the end of life of that PHP version.

See the composer.json for other requirements.

Installation

Use composer to install PhpSpreadsheet into your project:

composer require phpoffice/phpspreadsheet

Or also download the documentation and samples if you plan to use them (note that git must be in your path for this to work):

composer require phpoffice/phpspreadsheet --prefer-source

If you are building your installation on a development machine that is on a different PHP version to the server where it will be deployed, or if your PHP CLI version is different from your run-time such as php-fpm or Apache's mod_php, then you might want to configure composer for that. See composer documentation on how to edit your composer.json to ensure that the correct dependencies are retrieved to match your deployment environment.

See CLI vs Application run-time for more details.

Additional Installation Options

If you want to write to PDF, or to include Charts when you write to HTML or PDF, then you will need to install additional libraries:

PDF

For PDF Generation, you can install any of the following, and then configure PhpSpreadsheet to indicate which library you are going to use:

  • mpdf/mpdf
  • dompdf/dompdf
  • tecnickcom/tcpdf

and configure PhpSpreadsheet using:

// Dompdf, Mpdf or Tcpdf (as appropriate)
$className = \PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf::class;
IOFactory::registerWriter('Pdf', $className);

or the appropriate PDF Writer wrapper for the library that you have chosen to install.

Chart Export

For Chart export, we support the following packages, which you will also need to install yourself using composer require:

  • jpgraph/jpgraph (this package was abandoned in composer at version 4.0. You can manually download the latest version that supports PHP 8 and above from jpgraph.net)
  • mitoteam/jpgraph - up to date fork with modern PHP versions support and some bugs fixed.

and then configure PhpSpreadsheet using:

// to use jpgraph/jpgraph
Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class);
//or
// to use mitoteam/jpgraph
Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\MtJpGraphRenderer::class);

One or the other of these libraries is necessary if you want to generate HTML or PDF files that include charts; or to render a Chart to an Image format from within your code. They are not necessary to define charts for writing to Xlsx files. Other file formats don't support writing Charts.

Hello World

This would be the simplest way to write a spreadsheet:

<?php

require 'vendor/autoload.php';

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

$spreadsheet = new Spreadsheet();
$activeWorksheet = $spreadsheet->getActiveSheet();
$activeWorksheet->setCellValue('A1', 'Hello World !');

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

Learn by example

A good way to get started is to run some of the samples. Don't forget to download them via --prefer-source composer flag. And then serve them via PHP built-in webserver:

php -S localhost:8000 -t vendor/phpoffice/phpspreadsheet/samples

Then point your browser to http://localhost:8000/

The samples may also be run directly from the command line, for example:

php vendor/phpoffice/phpspreadsheet/samples/Basic/01_Simple.php

Learn by documentation

For more documentation in depth, you may read about an overview of the architecture, creating a spreadsheet, worksheets, accessing cells and reading and writing to files.

Or browse the API documentation.

Dark Mode

We are experimenting with different software and themes for our documentation. We try to honor your browser's dark/light mode settings, which may defer to your system's settings. A button is available at the top of each page to toggle the display without having to change your browser settings.
We are experimenting with different software and themes for our documentation. We try to honor your browser's dark/light mode settings, which may defer to your system's settings. This particular theme does not come with a toggle to switch back and forth. If you want to switch and it is inconvenient for you to change the browser setting:

Toggles If Your Browser Setting Is Dark Mode

If your setting is dark mode, and your browser supports ES11, this DarkModeToggle can be used as a bookmarklet. It executes:

Array.from(document.styleSheets).forEach((sheet) => {
    if (sheet.href?.includes('darkmode.css') ?? false) {
        sheet.disabled = !sheet.disabled;
    }
});

Toggles If Your Browser Setting Is Light Mode

If your setting is light mode, and your browser supports ES6, this LightModeToggle bookmarklet (changed 2026-09-18) can be used to toggle dark/light mode (or just reload the page to restore light mode):

(function(){
    document.documentElement.style.filter = document.documentElement.style.filter ? '' : 'invert(100%) hue-rotate(180deg)';
    const images = document.querySelectorAll('img');
    images.forEach(img => {
        if (!img.alt.startsWith('Logo')) {
            img.style.filter = img.style.filter ? '' : 'invert(100%) hue-rotate(180deg)';
        }
    });
    if (document.body.getAttribute('data-md-color-scheme') == 'slate') {
        document.body.setAttribute('data-md-color-scheme', 'default');
    } else {
        document.body.setAttribute('data-md-color-scheme', 'slate');
    }
})();

Displaying Images in Dark Mode

Images are not normally adjusted for Dark/Light mode. If you also want images to display in dark mode, try DarkImages3 as a bookmarklet. (You may have to execute it twice the first time on a page.) It executes:
{
    const images = document.querySelectorAll('img');
    images.forEach(img => {
        const temp = img.style.filter;
        if (temp == '' || temp == 'none') {
            img.style.filter = 'invert(1) hue-rotate(180deg)';
        } else {
            img.style.filter = 'none';
        }
    });
}

Credits

Please refer to the contributor list for up-to-date credits.