Overview
The Xlsx reader class loads Excel 2007 and later (.xlsx) files, which use the Office Open XML format. This is the most commonly used Excel format and supports all modern Excel features.
Namespace: PhpOffice\PhpSpreadsheet\Reader\Xlsx
Extends: BaseReader
Implements: IReader
Source: src/PhpSpreadsheet/Reader/Xlsx.php:49
Basic Usage
Simple File Loading
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
$reader = new Xlsx();
$spreadsheet = $reader->load('data.xlsx');
// Access worksheet data
$sheet = $spreadsheet->getActiveSheet();
$data = $sheet->toArray();
Using IOFactory
use PhpOffice\PhpSpreadsheet\IOFactory;
// Auto-detect and load
$spreadsheet = IOFactory::load('data.xlsx');
// Or create specific reader
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load('data.xlsx');
Key Methods
__construct()
Creates a new Xlsx reader instance.
public function __construct();
Example:
canRead()
Checks if the file can be read by this reader.
public function canRead(string $filename): bool;
Path to the file to check
Returns: bool - True if the file is a valid XLSX file
Example:
$reader = new Xlsx();
if ($reader->canRead('data.xlsx')) {
$spreadsheet = $reader->load('data.xlsx');
}
Loads a spreadsheet from an XLSX file.
public function load(string $filename, int $flags = 0): Spreadsheet;
Path to the XLSX file to load
Optional flags:
IReader::LOAD_WITH_CHARTS - Load charts from the file
IReader::READ_DATA_ONLY - Read only data, ignore formatting
IReader::IGNORE_EMPTY_CELLS - Skip empty cells
IReader::IGNORE_ROWS_WITH_NO_CELLS - Skip empty rows (Xlsx-specific)
IReader::ALLOW_EXTERNAL_IMAGES - Allow external images
IReader::CREATE_BLANK_SHEET_IF_NONE_READ - Create blank sheet if none read
Returns: Spreadsheet object
Example:
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\IReader;
$reader = new Xlsx();
$spreadsheet = $reader->load(
'data.xlsx',
IReader::READ_DATA_ONLY | IReader::IGNORE_EMPTY_CELLS
);
listWorksheetNames()
Returns worksheet names without loading the entire file.
public function listWorksheetNames(string $filename): array;
Returns: Array of worksheet names
Example:
$reader = new Xlsx();
$worksheetNames = $reader->listWorksheetNames('data.xlsx');
foreach ($worksheetNames as $name) {
echo "Sheet: $name\n";
}
listWorksheetInfo()
Returns detailed worksheet information without loading the entire file.
public function listWorksheetInfo(string $filename): array;
Returns: Array of worksheet information with keys:
worksheetName - Worksheet name
lastColumnLetter - Last column letter (e.g., ‘Z’)
lastColumnIndex - Last column index (0-based)
totalRows - Total number of rows
totalColumns - Total number of columns
sheetState - Visibility state (visible, hidden, veryHidden)
Example:
$reader = new Xlsx();
$info = $reader->listWorksheetInfo('data.xlsx');
foreach ($info as $worksheet) {
echo "Sheet: {$worksheet['worksheetName']}\n";
echo "Rows: {$worksheet['totalRows']}, ";
echo "Columns: {$worksheet['totalColumns']}\n";
echo "State: {$worksheet['sheetState']}\n";
}
Configuration Methods
setReadDataOnly()
Sets whether to read only data values (no formatting).
public function setReadDataOnly(bool $readDataOnly): self;
True to read only data, false to read data and formatting
Example:
$reader = new Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('data.xlsx');
setReadEmptyCells()
Sets whether to read empty cells.
public function setReadEmptyCells(bool $readEmptyCells): self;
True to read empty cells, false to skip them
Example:
$reader = new Xlsx();
$reader->setReadEmptyCells(false);
$spreadsheet = $reader->load('data.xlsx');
setIncludeCharts()
Sets whether to load charts from the file.
public function setIncludeCharts(bool $includeCharts): self;
True to load charts, false to ignore them
Example:
$reader = new Xlsx();
$reader->setIncludeCharts(true);
$spreadsheet = $reader->load('data.xlsx');
setLoadSheetsOnly()
Specifies which worksheets to load.
public function setLoadSheetsOnly(string|array|null $value): self;
value
string|array|null
required
Array of sheet names, single sheet name, or null for all sheets
Example:
// Load single sheet
$reader = new Xlsx();
$reader->setLoadSheetsOnly('Sheet1');
$spreadsheet = $reader->load('data.xlsx');
// Load multiple sheets
$reader->setLoadSheetsOnly(['Sheet1', 'Sheet3']);
$spreadsheet = $reader->load('data.xlsx');
setLoadAllSheets()
Resets the reader to load all worksheets.
public function setLoadAllSheets(): self;
Example:
$reader = new Xlsx();
$reader->setLoadSheetsOnly('Sheet1');
// ... later
$reader->setLoadAllSheets();
$spreadsheet = $reader->load('data.xlsx');
setReadFilter()
Sets a read filter to selectively load cells.
public function setReadFilter(IReadFilter $readFilter): self;
Object implementing IReadFilter interface
Example:
use PhpOffice\PhpSpreadsheet\Reader\IReadFilter;
class MyFilter implements IReadFilter
{
public function readCell(string $columnAddress, int $row, string $worksheetName = ''): bool
{
return $row >= 1 && $row <= 100; // Only rows 1-100
}
}
$reader = new Xlsx();
$reader->setReadFilter(new MyFilter());
$spreadsheet = $reader->load('data.xlsx');
Xlsx-Specific Features
setParseHuge()
Allows parsing of very large spreadsheets using LIBXML_PARSEHUGE option.
public function setParseHuge(bool $parseHuge): void;
True to enable LIBXML_PARSEHUGE, false to disable
This option can lead to memory leaks and failures. Use only when necessary for very large files.
Example:
$reader = new Xlsx();
$reader->setParseHuge(true);
$spreadsheet = $reader->load('very_large_file.xlsx');
setIgnoreRowsWithNoCells()
Ignores rows that contain no cells (Xlsx-specific optimization).
public function setIgnoreRowsWithNoCells(bool $ignoreRowsWithNoCells): self;
True to ignore empty rows, false to include them
Example:
$reader = new Xlsx();
$reader->setIgnoreRowsWithNoCells(true);
$spreadsheet = $reader->load('data.xlsx');
Supported Features
The Xlsx reader supports loading the following Excel features:
- Cell data - Values, formulas, data types
- Formatting - Fonts, colors, borders, fills, number formats
- Styling - Cell styles, conditional formatting
- Charts - All chart types (when
setIncludeCharts(true))
- Images - Embedded images and drawings
- Sheet properties - Hidden sheets, grid lines, headers/footers
- Page setup - Print settings, page margins, orientation
- Data validation - Cell validation rules
- Hyperlinks - Cell hyperlinks
- Comments - Cell comments
- Merged cells - Cell merges
- Named ranges - Defined names
- Tables - Excel tables
- Auto filters - Filter definitions
- Document properties - Title, author, keywords, etc.
Reading Large Files
For large XLSX files, use these optimization techniques:
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\IReader;
$reader = new Xlsx();
// Read data only (skip formatting)
$reader->setReadDataOnly(true);
// Ignore empty cells
$reader->setReadEmptyCells(false);
// Ignore empty rows
$reader->setIgnoreRowsWithNoCells(true);
// Load with flags
$spreadsheet = $reader->load(
'large_file.xlsx',
IReader::READ_DATA_ONLY |
IReader::IGNORE_EMPTY_CELLS |
IReader::IGNORE_ROWS_WITH_NO_CELLS
);
Chunked Reading
Read large files in chunks using a read filter:
use PhpOffice\PhpSpreadsheet\Reader\IReadFilter;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
class ChunkFilter implements IReadFilter
{
private int $startRow;
private int $endRow;
public function __construct(int $startRow, int $chunkSize)
{
$this->startRow = $startRow;
$this->endRow = $startRow + $chunkSize - 1;
}
public function readCell(string $columnAddress, int $row, string $worksheetName = ''): bool
{
return $row >= $this->startRow && $row <= $this->endRow;
}
}
$reader = new Xlsx();
$reader->setReadDataOnly(true);
// Process in chunks of 1000 rows
for ($startRow = 1; $startRow <= 10000; $startRow += 1000) {
$chunkFilter = new ChunkFilter($startRow, 1000);
$reader->setReadFilter($chunkFilter);
$spreadsheet = $reader->load('large_file.xlsx');
// Process this chunk
$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getRowIterator() as $row) {
// Process row
}
}
Error Handling
use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
$reader = new Xlsx();
try {
// Check if file can be read
if (!$reader->canRead('data.xlsx')) {
throw new Exception('File is not a valid XLSX file');
}
$spreadsheet = $reader->load('data.xlsx');
} catch (ReaderException $e) {
echo 'Error loading XLSX file: ' . $e->getMessage();
} catch (\Exception $e) {
echo 'General error: ' . $e->getMessage();
}
Security Considerations
XML External Entity (XXE) Protection
The Xlsx reader automatically uses the XmlScanner security scanner to protect against XXE attacks.
External Images
Be cautious when enabling external images:
$reader = new Xlsx();
// Use with caution - can expose to security risks
$reader->setAllowExternalImages(true);
// Better: use a whitelist callback
$reader->setIsWhitelisted(function(string $path): bool {
// Only allow specific domains
return str_starts_with($path, 'https://trusted-domain.com/');
});
Complete Example
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
// Create reader
$reader = new Xlsx();
// Configure reader
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly(['Sales', 'Inventory']);
try {
// Verify file
if (!$reader->canRead('report.xlsx')) {
throw new Exception('Invalid XLSX file');
}
// Load file
$spreadsheet = $reader->load('report.xlsx');
// Access data
$sheet = $spreadsheet->getSheetByName('Sales');
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
echo "Loaded {$highestRow} rows and {$highestColumn} columns\n";
// Process data
for ($row = 1; $row <= $highestRow; $row++) {
$value = $sheet->getCell("A{$row}")->getValue();
// Process value
}
} catch (ReaderException $e) {
echo 'Reader error: ' . $e->getMessage();
}