Skip to main content
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.
spreadsheet
Spreadsheet
required
The spreadsheet object to write

Key Methods

save()

public function save($filename, int $flags = 0): void
Saves the active worksheet as a CSV file.
filename
string|resource
required
File path or resource to write to
flags
int
default:"0"
Optional flags (see IWriter constants)

setDelimiter()

public function setDelimiter(string $delimiter): self
Sets the field delimiter character.
delimiter
string
default:","
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
string
default:"\""
Enclosure character (typically ’”‘)

setLineEnding()

public function setLineEnding(string $lineEnding): self
Sets the line ending sequence.
lineEnding
string
default:"PHP_EOL"
Line ending: ‘\n’ (Unix) or ‘\r\n’ (Windows)

setSheetIndex()

public function setSheetIndex(int $sheetIndex): self
Selects which worksheet to export.
sheetIndex
int
required
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.
useBOM
bool
required
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.
includeSeparatorLine
bool
required
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.
excelCompatibility
bool
required
True to enable Excel compatibility

setOutputEncoding()

public function setOutputEncoding(string $outputEncoding): self
Sets the output character encoding.
outputEncoding
string
required
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.
pValue
bool
required
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.
value
bool
required
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');

Format Limitations

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

Pre-calculate Formulas

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');

Build docs developers (and LLMs) love