The Ods writer exports spreadsheets to OpenDocument Spreadsheet format (.ods), the native format for LibreOffice Calc and OpenOffice Calc.
Namespace: PhpOffice\PhpSpreadsheet\Writer\Ods
Extends: BaseWriter
Class Overview
The Ods writer creates ZIP archives containing XML files that conform to the OASIS OpenDocument Format (ODF) standard. The format is open, XML-based, and widely supported by open-source office suites.
Constructor
public function __construct(Spreadsheet $spreadsheet)
Creates a new Ods writer instance.
The spreadsheet object to write
Key Methods
save()
public function save($filename, int $flags = 0): void
Saves the spreadsheet as an .ods file.
File path or resource to write to
public function useAdditionalNumberFormats(array $additionalNumberFormats): void
Registers additional number format converters for custom formats.
additionalNumberFormats
array<string, callable>
required
Array mapping format codes to converter functions
Usage Examples
Basic Export
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Ods;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World!');
$writer = new Ods($spreadsheet);
$writer->save('hello.ods');
Download to Browser
use PhpOffice\PhpSpreadsheet\Writer\Ods;
// Set headers for download
header('Content-Type: application/vnd.oasis.opendocument.spreadsheet');
header('Content-Disposition: attachment;filename="report.ods"');
header('Cache-Control: max-age=0');
$writer = new Ods($spreadsheet);
$writer->save('php://output');
exit;
use PhpOffice\PhpSpreadsheet\Writer\Ods;
$writer = new Ods($spreadsheet);
// Add custom number format converter
$writer->useAdditionalNumberFormats([
'CUSTOM_FORMAT' => function($format) {
// Convert custom format to ODS format
return convertToOdsFormat($format);
}
]);
$writer->save('output.ods');
use PhpOffice\PhpSpreadsheet\Writer\Ods;
$writer = new Ods($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save('output.ods');
The Ods writer supports:
- ✅ Multiple worksheets
- ✅ Cell formatting (fonts, colors, borders, fills)
- ✅ Number formats
- ✅ Formulas
- ⚠️ Charts (limited support)
- ⚠️ Images (limited support)
- ✅ Rich text
- ✅ Merged cells
- ⚠️ Data validation (basic support)
- ⚠️ Conditional formatting (limited)
- ✅ Page setup
- ✅ Headers and footers (basic)
- ✅ Document properties
- ✅ Named ranges
- ✅ Autofilters
- ⚠️ Tables (limited support)
- ✅ Comments
- ✅ Hyperlinks
File Structure
The ODS file is a ZIP archive containing:
- content.xml - Spreadsheet data and formulas
- styles.xml - Style definitions
- meta.xml - Document metadata
- settings.xml - View settings
- META-INF/manifest.xml - Package manifest
- mimetype - MIME type declaration
- Thumbnails/thumbnail.png - Preview thumbnail
OpenDocument Compliance
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Ods;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set document metadata (ODF properties)
$props = $spreadsheet->getProperties();
$props->setCreator('John Doe');
$props->setTitle('My Document');
$props->setSubject('Sales Report');
$props->setDescription('Q4 2024 sales data');
$props->setKeywords('sales, report, q4');
$props->setCategory('Reports');
$writer = new Ods($spreadsheet);
$writer->save('report.ods');
LibreOffice Compatibility
The Ods writer is optimized for LibreOffice Calc and OpenOffice Calc:
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Ods;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set print area
$sheet->getPageSetup()->setPrintArea('A1:E50');
// Set page orientation
$sheet->getPageSetup()->setOrientation(
\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE
);
$writer = new Ods($spreadsheet);
$writer->save('calc.ods');
ODS uses OpenFormula syntax, which is similar to Excel but has some differences:
// Standard formulas work across formats
$sheet->setCellValue('A1', 10);
$sheet->setCellValue('A2', 20);
$sheet->setCellValue('A3', '=SUM(A1:A2)');
// Pre-calculate formulas for immediate display
$writer = new Ods($spreadsheet);
$writer->setPreCalculateFormulas(true);
$writer->save('output.ods');
When to Use ODS
Use the Ods writer when:
- ✅ Targeting LibreOffice or OpenOffice users
- ✅ Open standards compliance is required
- ✅ Cross-platform compatibility is important
- ✅ Working in open-source environments
Consider other formats when:
- ❌ Advanced Excel-specific features are needed
- ❌ Target users primarily use Microsoft Excel
- ❌ Complex charts are required
- ❌ Rich image embedding is needed