The Csv writer exports spreadsheet data to CSV (Comma-Separated Values) format, a simple text-based format widely used for data exchange.
Namespace: PhpOffice\PhpSpreadsheet\Writer\Csv
Extends: BaseWriter
Class Overview
The Csv writer exports a single worksheet as plain text with delimited values. It only exports cell values, not formatting, formulas, or other spreadsheet features.
CSV files only support a single worksheet. If your spreadsheet has multiple sheets, you must select which one to export.
Constructor
public function __construct(Spreadsheet $spreadsheet)
Creates a new Csv writer instance.
The spreadsheet object to write
Key Methods
save()
public function save($filename, int $flags = 0): void
Saves the active worksheet as a CSV file.
File path or resource to write to
setDelimiter()
public function setDelimiter(string $delimiter): self
Sets the field delimiter character.
Delimiter character (e.g., ’,’, ’;’, ‘\t’)
setEnclosure()
public function setEnclosure(string $enclosure = '"'): self
Sets the field enclosure character used to wrap values containing special characters.
Enclosure character (typically ’”‘)
setLineEnding()
public function setLineEnding(string $lineEnding): self
Sets the line ending sequence.
Line ending: ‘\n’ (Unix) or ‘\r\n’ (Windows)
setSheetIndex()
public function setSheetIndex(int $sheetIndex): self
Selects which worksheet to export.
Zero-based index of the worksheet to export
setUseBOM()
public function setUseBOM(bool $useBOM): self
Controls whether a UTF-8 BOM (Byte Order Mark) should be written at the start of the file.
True to include BOM, false to omit it
setIncludeSeparatorLine()
public function setIncludeSeparatorLine(bool $includeSeparatorLine): self
Controls whether a separator line (sep=x) should be included as the first line.
True to include separator line, false to omit it
setExcelCompatibility()
public function setExcelCompatibility(bool $excelCompatibility): self
Enables full Excel compatibility mode. This sets UTF-8 BOM, semicolon delimiter, double-quote enclosure, and CRLF line endings.
True to enable Excel compatibility
setOutputEncoding()
public function setOutputEncoding(string $outputEncoding): self
Sets the output character encoding.
Character encoding (e.g., ‘UTF-8’, ‘ISO-8859-1’)
setVariableColumns()
public function setVariableColumns(bool $pValue): self
Controls whether the number of columns should be allowed to vary between rows.
True for variable columns, false for fixed range
setEnclosureRequired()
public function setEnclosureRequired(bool $value): self
Controls whether all fields should be enclosed, or only those containing special characters.
True to always enclose fields, false to enclose only when needed
setPreferHyperlinkToLabel()
public function setPreferHyperlinkToLabel(bool $preferHyperlinkToLabel): self
Controls whether to export hyperlink URLs instead of cell labels.
True to export URLs, false to export labels
Usage Examples
Basic Export
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->fromArray([
['Name', 'Email', 'Phone'],
['John Doe', '[email protected]', '555-1234'],
['Jane Smith', '[email protected]', '555-5678']
]);
$writer = new Csv($spreadsheet);
$writer->save('contacts.csv');
Custom Delimiter (Semicolon)
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$writer = new Csv($spreadsheet);
$writer->setDelimiter(';');
$writer->save('data.csv');
Tab-Delimited File
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$writer = new Csv($spreadsheet);
$writer->setDelimiter("\t");
$writer->save('data.tsv');
Excel-Compatible CSV
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$writer = new Csv($spreadsheet);
$writer->setExcelCompatibility(true);
$writer->save('excel.csv');
// Equivalent to:
// $writer->setUseBOM(true);
// $writer->setIncludeSeparatorLine(true);
// $writer->setEnclosure('"');
// $writer->setDelimiter(';');
// $writer->setLineEnding("\r\n");
Export Specific Sheet
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$writer = new Csv($spreadsheet);
$writer->setSheetIndex(1); // Export second sheet
$writer->save('sheet2.csv');
UTF-8 with BOM
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$writer = new Csv($spreadsheet);
$writer->setUseBOM(true); // Helps Excel recognize UTF-8 encoding
$writer->save('utf8.csv');
Alternative Encoding
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$writer = new Csv($spreadsheet);
$writer->setOutputEncoding('ISO-8859-1');
$writer->save('latin1.csv');
Export to String
use PhpOffice\PhpSpreadsheet\Writer\Csv;
$stream = fopen('php://temp', 'r+');
$writer = new Csv($spreadsheet);
$writer->save($stream);
rewind($stream);
$csvContent = stream_get_contents($stream);
fclose($stream);
// Use $csvContent as needed
Download to Browser
use PhpOffice\PhpSpreadsheet\Writer\Csv;
// Set headers for download
header('Content-Type: text/csv');
header('Content-Disposition: attachment;filename="data.csv"');
header('Cache-Control: max-age=0');
$writer = new Csv($spreadsheet);
$writer->setUseBOM(true);
$writer->save('php://output');
exit;
Export URLs Instead of Labels
use PhpOffice\PhpSpreadsheet\Writer\Csv;
// If cells contain hyperlinks, export the URLs
$writer = new Csv($spreadsheet);
$writer->setPreferHyperlinkToLabel(true);
$writer->save('urls.csv');
Minimal Enclosure
use PhpOffice\PhpSpreadsheet\Writer\Csv;
// Only enclose fields that contain special characters
$writer = new Csv($spreadsheet);
$writer->setEnclosureRequired(false);
$writer->save('minimal.csv');
CSV files do not support:
- ❌ Multiple worksheets (single sheet only)
- ❌ Cell formatting (colors, fonts, borders)
- ❌ Formulas (only values are exported)
- ❌ Charts
- ❌ Images
- ❌ Merged cells
- ❌ Data types (everything is text)
- ❌ Metadata
Best Practices
use PhpOffice\PhpSpreadsheet\Writer\Csv;
// Calculate formulas before export
$writer = new Csv($spreadsheet);
$writer->setPreCalculateFormulas(true);
$writer->save('calculated.csv');
Handle Special Characters
use PhpOffice\PhpSpreadsheet\Writer\Csv;
// Proper handling of commas, quotes, and newlines
$sheet->setCellValue('A1', 'Text with, comma');
$sheet->setCellValue('A2', 'Text with "quotes"');
$sheet->setCellValue('A3', "Text with\nNewline");
$writer = new Csv($spreadsheet);
$writer->setEnclosure('"'); // Fields will be properly escaped
$writer->save('special.csv');
Regional Settings
use PhpOffice\PhpSpreadsheet\Writer\Csv;
// For European Excel (uses semicolon and comma for decimals)
$writer = new Csv($spreadsheet);
$writer->setDelimiter(';');
$writer->setUseBOM(true);
$writer->save('european.csv');