Skip to main content

Overview

The Ods reader class loads OpenDocument Spreadsheet (.ods) files, which is an open standard spreadsheet format used by LibreOffice, OpenOffice, and other applications.

Class Information

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:
$reader = new Ods();

canRead()

Checks if the file can be read by this reader.
public function canRead(string $filename): bool;
filename
string
required
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');
}

load()

Loads a spreadsheet from an ODS file.
public function load(string $filename, int $flags = 0): Spreadsheet;
filename
string
required
Path to the ODS file to load
flags
int
default:"0"
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;
filename
string
required
Path to the ODS file
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;
filename
string
required
Path to the ODS file
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;
readDataOnly
bool
required
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;
readEmptyCells
bool
required
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;
includeCharts
bool
required
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;
readFilter
IReadFilter
required
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.

Formula Support

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";
}

Performance Optimization

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();
}

OpenDocument Format

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

Build docs developers (and LLMs) love