Overview
The Ods reader class loads OpenDocument Spreadsheet (.ods) files, which is an open standard spreadsheet format used by LibreOffice, OpenOffice, and other applications.
Namespace: PhpOffice\PhpSpreadsheet\Reader\Ods
Extends: BaseReader
Implements: IReader
Source: src/PhpSpreadsheet/Reader/Ods.php:40
Basic Usage
Simple File Loading
use PhpOffice\PhpSpreadsheet\Reader\Ods;
$reader = new Ods();
$spreadsheet = $reader->load('data.ods');
// Access worksheet data
$sheet = $spreadsheet->getActiveSheet();
$data = $sheet->toArray();
Using IOFactory
use PhpOffice\PhpSpreadsheet\IOFactory;
// Auto-detect and load
$spreadsheet = IOFactory::load('data.ods');
// Or create specific reader
$reader = IOFactory::createReader('Ods');
$spreadsheet = $reader->load('data.ods');
Key Methods
__construct()
Creates a new Ods 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 ODS file
Example:
$reader = new Ods();
if ($reader->canRead('data.ods')) {
$spreadsheet = $reader->load('data.ods');
}
Loads a spreadsheet from an ODS file.
public function load(string $filename, int $flags = 0): Spreadsheet;
Path to the ODS 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::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\Ods;
use PhpOffice\PhpSpreadsheet\Reader\IReader;
$reader = new Ods();
$spreadsheet = $reader->load(
'data.ods',
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 Ods();
$worksheetNames = $reader->listWorksheetNames('data.ods');
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)
Example:
$reader = new Ods();
$info = $reader->listWorksheetInfo('data.ods');
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 Ods();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('data.ods');
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 Ods();
$reader->setReadEmptyCells(false);
$spreadsheet = $reader->load('data.ods');
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 Ods();
$reader->setIncludeCharts(true);
$spreadsheet = $reader->load('data.ods');
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 Ods();
$reader->setLoadSheetsOnly('Sheet1');
$spreadsheet = $reader->load('data.ods');
// Load multiple sheets
$reader->setLoadSheetsOnly(['Sheet1', 'Sheet3']);
$spreadsheet = $reader->load('data.ods');
setLoadAllSheets()
Resets the reader to load all worksheets.
public function setLoadAllSheets(): self;
Example:
$reader = new Ods();
$reader->setLoadSheetsOnly('Sheet1');
// ... later
$reader->setLoadAllSheets();
$spreadsheet = $reader->load('data.ods');
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;
use PhpOffice\PhpSpreadsheet\Reader\Ods;
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 Ods();
$reader->setReadFilter(new MyFilter());
$spreadsheet = $reader->load('data.ods');
Supported Features
The Ods reader supports loading the following OpenDocument Spreadsheet features:
- Cell data - Values, formulas, data types
- Formatting - Fonts, colors, borders, fills, number formats
- Styling - Cell styles, conditional formatting
- Charts - Basic chart support (when
setIncludeCharts(true))
- Images - Embedded images
- Sheet properties - Hidden sheets, grid lines
- Page setup - Print settings, page margins
- Data validation - Cell validation rules
- Hyperlinks - Cell hyperlinks
- Comments - Cell comments
- Merged cells - Cell merges
- Named ranges - Defined names
- Auto filters - Filter definitions
- Document properties - Title, author, keywords, etc.
The Ods reader includes a formula translator (FormulaTranslator) to convert ODS formulas to PhpSpreadsheet format:
$reader = new Ods();
$spreadsheet = $reader->load('data.ods');
$sheet = $spreadsheet->getActiveSheet();
$cell = $sheet->getCell('A1');
// Formulas are automatically translated
if ($cell->getDataType() === 'f') {
$formula = $cell->getValue();
echo "Formula: $formula\n";
}
Reading Large Files
For large ODS files, use these optimization techniques:
use PhpOffice\PhpSpreadsheet\Reader\Ods;
use PhpOffice\PhpSpreadsheet\Reader\IReader;
$reader = new Ods();
// Read data only (skip formatting)
$reader->setReadDataOnly(true);
// Ignore empty cells
$reader->setReadEmptyCells(false);
// Load with flags
$spreadsheet = $reader->load(
'large_file.ods',
IReader::READ_DATA_ONLY | IReader::IGNORE_EMPTY_CELLS
);
Chunked Reading
Read large files in chunks using a read filter:
use PhpOffice\PhpSpreadsheet\Reader\IReadFilter;
use PhpOffice\PhpSpreadsheet\Reader\Ods;
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 Ods();
$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.ods');
// 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\Ods;
$reader = new Ods();
try {
// Check if file can be read
if (!$reader->canRead('data.ods')) {
throw new Exception('File is not a valid ODS file');
}
$spreadsheet = $reader->load('data.ods');
} catch (ReaderException $e) {
echo 'Error loading ODS file: ' . $e->getMessage();
} catch (\Exception $e) {
echo 'General error: ' . $e->getMessage();
}
Security Considerations
XML External Entity (XXE) Protection
The Ods reader automatically uses the XmlScanner security scanner to protect against XXE attacks.
External Images
Be cautious when enabling external images:
$reader = new Ods();
// 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\Ods;
use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
// Create reader
$reader = new Ods();
// Configure reader
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly(['Data', 'Summary']);
try {
// Verify file
if (!$reader->canRead('report.ods')) {
throw new Exception('Invalid ODS file');
}
// Load file
$spreadsheet = $reader->load('report.ods');
// Access data
$sheet = $spreadsheet->getSheetByName('Data');
$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();
}
ODS files are ZIP archives containing XML files. The Ods reader uses XMLReader for efficient parsing of the content.xml file which contains the spreadsheet data.
Key files in an ODS archive:
content.xml - Main spreadsheet content
meta.xml - Document metadata
styles.xml - Style definitions
mimetype - File type identifier