Documentation Index
Fetch the complete documentation index at: https://mintlify.com/PHPOffice/PhpSpreadsheet/llms.txt
Use this file to discover all available pages before exploring further.
The IOFactory class provides static factory methods to easily read and write spreadsheet files. It automatically detects file formats and creates the appropriate reader or writer.
Class Overview
Namespace: PhpOffice\PhpSpreadsheet
Source: src/PhpSpreadsheet/IOFactory.php
IOFactory simplifies file operations by automatically identifying file types and instantiating the correct reader/writer classes.
Reader Type Constants
IOFactory::READER_XLSX // Excel 2007+ (XLSX)
IOFactory::READER_XLS // Excel 97-2003 (XLS)
IOFactory::READER_XML // Excel 2003 XML
IOFactory::READER_ODS // OpenDocument Spreadsheet
IOFactory::READER_SLK // Symbolic Link (SYLK)
IOFactory::READER_GNUMERIC // Gnumeric
IOFactory::READER_HTML // HTML
IOFactory::READER_CSV // CSV
Writer Type Constants
IOFactory::WRITER_XLSX // Excel 2007+ (XLSX)
IOFactory::WRITER_XLS // Excel 97-2003 (XLS)
IOFactory::WRITER_ODS // OpenDocument Spreadsheet
IOFactory::WRITER_CSV // CSV
IOFactory::WRITER_HTML // HTML
Loading Files
load(string $filename, int $flags = 0, ?array $readers = null)
Load a spreadsheet from a file with automatic format detection.
Path to the spreadsheet file
Optional flags for loading behavior:
IReader::LOAD_WITH_CHARTS - Include charts
IReader::READ_DATA_ONLY - Read only values, not formatting
IReader::IGNORE_EMPTY_CELLS - Skip empty cells
Optional array of reader types to try (e.g., [IOFactory::READER_XLSX, IOFactory::READER_XLS])
Loaded spreadsheet object
use PhpOffice\PhpSpreadsheet\IOFactory;
// Simple load (auto-detect format)
$spreadsheet = IOFactory::load('data.xlsx');
// Load with flags
$spreadsheet = IOFactory::load(
'data.xlsx',
IReader::LOAD_WITH_CHARTS | IReader::READ_DATA_ONLY
);
// Load, trying only specific readers
$spreadsheet = IOFactory::load(
'data.file',
0,
[IOFactory::READER_XLSX, IOFactory::READER_XLS]
);
Creating Readers
createReader(string $readerType)
Create a reader instance for a specific format.
Reader type (use IOFactory::READER_* constants)
use PhpOffice\PhpSpreadsheet\IOFactory;
// Create XLSX reader
$reader = IOFactory::createReader(IOFactory::READER_XLSX);
$spreadsheet = $reader->load('data.xlsx');
// Create CSV reader with custom settings
$reader = IOFactory::createReader(IOFactory::READER_CSV);
$reader->setDelimiter(',');
$reader->setEnclosure('"');
$reader->setSheetIndex(0);
$spreadsheet = $reader->load('data.csv');
createReaderForFile(string $filename, ?array $readers = null)
Create a reader by automatically detecting the file type.
Optional list of reader types to try
Appropriate reader instance
use PhpOffice\PhpSpreadsheet\IOFactory;
// Auto-detect and create reader
$reader = IOFactory::createReaderForFile('data.xlsx');
$spreadsheet = $reader->load('data.xlsx');
// Configure reader before loading
$reader = IOFactory::createReaderForFile('large-file.xlsx');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('large-file.xlsx');
Identifying Files
identify(string $filename, ?array $readers = null, bool $fullClassName = false)
Identify the file type without loading it.
Optional list of reader types to try
Return full class name instead of short type
use PhpOffice\PhpSpreadsheet\IOFactory;
// Get simple type name
$type = IOFactory::identify('data.xlsx');
echo $type; // 'Xlsx'
// Get full class name
$className = IOFactory::identify('data.xlsx', null, true);
echo $className; // 'PhpOffice\PhpSpreadsheet\Reader\Xlsx'
Creating Writers
createWriter(Spreadsheet $spreadsheet, string $writerType)
Create a writer instance for a specific format.
Spreadsheet object to write
Writer type (use IOFactory::WRITER_* constants)
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = new Spreadsheet();
// ... populate spreadsheet ...
// Create XLSX writer
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_XLSX);
$writer->save('output.xlsx');
// Create CSV writer
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_CSV);
$writer->setDelimiter(';');
$writer->setEnclosure('');
$writer->setSheetIndex(0);
$writer->save('output.csv');
Registering Custom Readers/Writers
registerReader(string $readerType, string $readerClass)
Register a custom reader.
Unique identifier for the reader
Fully qualified class name implementing IReader
use PhpOffice\PhpSpreadsheet\IOFactory;
IOFactory::registerReader('MyFormat', 'App\Reader\MyFormatReader');
$reader = IOFactory::createReader('MyFormat');
registerWriter(string $writerType, string $writerClass)
Register a custom writer.
Unique identifier for the writer
Fully qualified class name implementing IWriter
use PhpOffice\PhpSpreadsheet\IOFactory;
IOFactory::registerWriter('MyFormat', 'App\Writer\MyFormatWriter');
$writer = IOFactory::createWriter($spreadsheet, 'MyFormat');
Complete Examples
Reading Files
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\IReader;
// Example 1: Simple load with auto-detection
$spreadsheet = IOFactory::load('sales-data.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
// Example 2: Load with specific options
$spreadsheet = IOFactory::load(
'large-file.xlsx',
IReader::READ_DATA_ONLY | IReader::IGNORE_EMPTY_CELLS
);
// Example 3: Identify file type before loading
$fileType = IOFactory::identify('unknown-file.bin');
echo "File type: $fileType";
if ($fileType === 'Xlsx') {
$spreadsheet = IOFactory::load('unknown-file.bin');
}
// Example 4: Create reader with custom settings
$reader = IOFactory::createReader(IOFactory::READER_CSV);
$reader->setDelimiter(';');
$reader->setEnclosure('"');
$reader->setInputEncoding('UTF-8');
$reader->setSheetIndex(0);
$spreadsheet = $reader->load('data.csv');
// Example 5: Load only specific sheets
$reader = IOFactory::createReaderForFile('workbook.xlsx');
$reader->setLoadSheetsOnly(['Sheet1', 'Sheet3']);
$spreadsheet = $reader->load('workbook.xlsx');
Writing Files
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
// Add data
$worksheet->setCellValue('A1', 'Product');
$worksheet->setCellValue('B1', 'Price');
$worksheet->setCellValue('A2', 'Widget');
$worksheet->setCellValue('B2', 19.99);
// Example 1: Save as XLSX
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_XLSX);
$writer->save('output.xlsx');
// Example 2: Save as Excel 97-2003
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_XLS);
$writer->save('output.xls');
// Example 3: Save as CSV
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_CSV);
$writer->setDelimiter(',');
$writer->setEnclosure('"');
$writer->setLineEnding("\r\n");
$writer->setSheetIndex(0);
$writer->save('output.csv');
// Example 4: Save as HTML
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_HTML);
$writer->setSheetIndex(0);
$writer->save('output.html');
// Example 5: Save to output stream
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_XLSX);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="report.xlsx"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
Reading and Converting
use PhpOffice\PhpSpreadsheet\IOFactory;
// Convert XLS to XLSX
$spreadsheet = IOFactory::load('old-format.xls');
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_XLSX);
$writer->save('new-format.xlsx');
// Convert Excel to CSV
$spreadsheet = IOFactory::load('data.xlsx');
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_CSV);
$writer->setDelimiter(',');
$writer->setEnclosure('"');
$writer->save('data.csv');
// Convert to HTML
$spreadsheet = IOFactory::load('report.xlsx');
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_HTML);
$writer->save('report.html');
Error Handling
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
// Reading with error handling
try {
$spreadsheet = IOFactory::load('file.xlsx');
echo "File loaded successfully";
} catch (ReaderException $e) {
echo "Error reading file: " . $e->getMessage();
} catch (\Exception $e) {
echo "General error: " . $e->getMessage();
}
// Writing with error handling
try {
$writer = IOFactory::createWriter($spreadsheet, IOFactory::WRITER_XLSX);
$writer->save('output.xlsx');
echo "File saved successfully";
} catch (WriterException $e) {
echo "Error writing file: " . $e->getMessage();
} catch (\Exception $e) {
echo "General error: " . $e->getMessage();
}
Reader Flags
When using the load() method, you can combine these flags:
use PhpOffice\PhpSpreadsheet\Reader\IReader;
// Load with charts included
$spreadsheet = IOFactory::load('file.xlsx', IReader::LOAD_WITH_CHARTS);
// Load only cell values (no formatting)
$spreadsheet = IOFactory::load('file.xlsx', IReader::READ_DATA_ONLY);
// Skip empty cells
$spreadsheet = IOFactory::load('file.xlsx', IReader::IGNORE_EMPTY_CELLS);
// Combine multiple flags
$spreadsheet = IOFactory::load(
'file.xlsx',
IReader::READ_DATA_ONLY | IReader::IGNORE_EMPTY_CELLS
);
- Spreadsheet - Main spreadsheet class
IReader - Reader interface
IWriter - Writer interface
Reader\Xlsx - Excel 2007+ reader
Reader\Csv - CSV reader
Writer\Xlsx - Excel 2007+ writer
Writer\Csv - CSV writer