See Release Notes
Long Term Support Release
<?php namespace PhpOffice\PhpSpreadsheet\Writer; use PhpOffice\PhpSpreadsheet\Calculation\Calculation; use PhpOffice\PhpSpreadsheet\Spreadsheet; class Csv extends BaseWriter { /** * PhpSpreadsheet object. * * @var Spreadsheet */ private $spreadsheet; /** * Delimiter. * * @var string */ private $delimiter = ','; /** * Enclosure. * * @var string */ private $enclosure = '"'; /** * Line ending. * * @var string */ private $lineEnding = PHP_EOL; /** * Sheet index to write. * * @var int */ private $sheetIndex = 0; /** * Whether to write a BOM (for UTF8). * * @var bool */ private $useBOM = false; /** * Whether to write a Separator line as the first line of the file * sep=x. * * @var bool */ private $includeSeparatorLine = false; /** * Whether to write a fully Excel compatible CSV file. * * @var bool */ private $excelCompatibility = false; /**> * Output encoding. * Create a new CSV. > * * > * @var string * @param Spreadsheet $spreadsheet Spreadsheet object > */ */ > private $outputEncoding = ''; public function __construct(Spreadsheet $spreadsheet) > { > /**$this->spreadsheet = $spreadsheet; } /** * Save PhpSpreadsheet to file. *< * @param string $pFilename < * < * @throws Exception> * @param resource|string $filename*/< public function save($pFilename)> public function save($filename, int $flags = 0): void{> $this->processFlags($flags); // Fetch sheet >$sheet = $this->spreadsheet->getSheet($this->sheetIndex); $saveDebugLog = Calculation::getInstance($this->spreadsheet)->getDebugLog()->getWriteDebugLog(); Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog(false); $saveArrayReturnType = Calculation::getArrayReturnType(); Calculation::setArrayReturnType(Calculation::RETURN_ARRAY_AS_VALUE); // Open file< $fileHandle = fopen($pFilename, 'wb+'); < if ($fileHandle === false) { < throw new Exception("Could not open file $pFilename for writing."); < }> $this->openFileHandle($filename);if ($this->excelCompatibility) { $this->setUseBOM(true); // Enforce UTF-8 BOM Header $this->setIncludeSeparatorLine(true); // Set separator line $this->setEnclosure('"'); // Set enclosure to " $this->setDelimiter(';'); // Set delimiter to a semi-colon $this->setLineEnding("\r\n"); }>if ($this->useBOM) { // Write the UTF-8 BOM code if required< fwrite($fileHandle, "\xEF\xBB\xBF");> fwrite($this->fileHandle, "\xEF\xBB\xBF");}>if ($this->includeSeparatorLine) { // Write the separator line if required< fwrite($fileHandle, 'sep=' . $this->getDelimiter() . $this->lineEnding);> fwrite($this->fileHandle, 'sep=' . $this->getDelimiter() . $this->lineEnding);} // Identify the range that we need to extract from the worksheet $maxCol = $sheet->getHighestDataColumn(); $maxRow = $sheet->getHighestDataRow(); // Write rows to file for ($row = 1; $row <= $maxRow; ++$row) { // Convert the row to an array... $cellsArray = $sheet->rangeToArray('A' . $row . ':' . $maxCol . $row, '', $this->preCalculateFormulas); // ... and write to the file< $this->writeLine($fileHandle, $cellsArray[0]);> $this->writeLine($this->fileHandle, $cellsArray[0]);}< // Close file < fclose($fileHandle); <> $this->maybeCloseFileHandle();Calculation::setArrayReturnType($saveArrayReturnType); Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); } /** * Get delimiter. * * @return string */ public function getDelimiter() { return $this->delimiter; } /** * Set delimiter. *< * @param string $pValue Delimiter, defaults to ','> * @param string $delimiter Delimiter, defaults to ','*< * @return CSV> * @return $this*/< public function setDelimiter($pValue)> public function setDelimiter($delimiter){< $this->delimiter = $pValue;> $this->delimiter = $delimiter;return $this; } /** * Get enclosure. * * @return string */ public function getEnclosure() { return $this->enclosure; } /** * Set enclosure. *< * @param string $pValue Enclosure, defaults to "> * @param string $enclosure Enclosure, defaults to "*< * @return CSV> * @return $this*/< public function setEnclosure($pValue)> public function setEnclosure($enclosure = '"'){< if ($pValue == '') { < $pValue = null; < } < $this->enclosure = $pValue;> $this->enclosure = $enclosure;return $this; } /** * Get line ending. * * @return string */ public function getLineEnding() { return $this->lineEnding; } /** * Set line ending. *< * @param string $pValue Line ending, defaults to OS line ending (PHP_EOL)> * @param string $lineEnding Line ending, defaults to OS line ending (PHP_EOL)*< * @return CSV> * @return $this*/< public function setLineEnding($pValue)> public function setLineEnding($lineEnding){< $this->lineEnding = $pValue;> $this->lineEnding = $lineEnding;return $this; } /** * Get whether BOM should be used. * * @return bool */ public function getUseBOM() { return $this->useBOM; } /** * Set whether BOM should be used. *< * @param bool $pValue Use UTF-8 byte-order mark? Defaults to false> * @param bool $useBOM Use UTF-8 byte-order mark? Defaults to false*< * @return CSV> * @return $this*/< public function setUseBOM($pValue)> public function setUseBOM($useBOM){< $this->useBOM = $pValue;> $this->useBOM = $useBOM;return $this; } /** * Get whether a separator line should be included. * * @return bool */ public function getIncludeSeparatorLine() { return $this->includeSeparatorLine; } /** * Set whether a separator line should be included as the first line of the file. *< * @param bool $pValue Use separator line? Defaults to false> * @param bool $includeSeparatorLine Use separator line? Defaults to false*< * @return CSV> * @return $this*/< public function setIncludeSeparatorLine($pValue)> public function setIncludeSeparatorLine($includeSeparatorLine){< $this->includeSeparatorLine = $pValue;> $this->includeSeparatorLine = $includeSeparatorLine;return $this; } /** * Get whether the file should be saved with full Excel Compatibility. * * @return bool */ public function getExcelCompatibility() { return $this->excelCompatibility; } /** * Set whether the file should be saved with full Excel Compatibility. *< * @param bool $pValue Set the file to be written as a fully Excel compatible csv file> * @param bool $excelCompatibility Set the file to be written as a fully Excel compatible csv file* Note that this overrides other settings such as useBOM, enclosure and delimiter *< * @return CSV> * @return $this*/< public function setExcelCompatibility($pValue)> public function setExcelCompatibility($excelCompatibility){< $this->excelCompatibility = $pValue;> $this->excelCompatibility = $excelCompatibility;return $this; } /** * Get sheet index. * * @return int */ public function getSheetIndex() { return $this->sheetIndex; } /** * Set sheet index. *< * @param int $pValue Sheet index> * @param int $sheetIndex Sheet index > * > * @return $this > */ > public function setSheetIndex($sheetIndex) > { > $this->sheetIndex = $sheetIndex; > > return $this; > } > > /** > * Get output encoding. > * > * @return string > */ > public function getOutputEncoding() > { > return $this->outputEncoding; > } > > /** > * Set output encoding. > * > * @param string $outputEnconding Output encoding*< * @return CSV> * @return $this*/< public function setSheetIndex($pValue)> public function setOutputEncoding($outputEnconding){< $this->sheetIndex = $pValue;> $this->outputEncoding = $outputEnconding;return $this; }> /** @var bool */ /** > private $enclosureRequired = true; * Write line to CSV file. > * > public function setEnclosureRequired(bool $value): self * @param resource $pFileHandle PHP filehandle > { * @param array $pValues Array containing values in a row > $this->enclosureRequired = $value; */ > private function writeLine($pFileHandle, array $pValues) > return $this; { > } // No leading delimiter > $writeDelimiter = false; > public function getEnclosureRequired(): bool > { // Build the line > return $this->enclosureRequired; $line = ''; > } > foreach ($pValues as $element) { > /** // Escape enclosures > * Convert boolean to TRUE/FALSE; otherwise return element cast to string. $element = str_replace($this->enclosure, $this->enclosure . $this->enclosure, $element); > * > * @param mixed $element // Add delimiter > */ if ($writeDelimiter) { > private static function elementToString($element): string $line .= $this->delimiter; > { } else { > if (is_bool($element)) { $writeDelimiter = true; > return $element ? 'TRUE' : 'FALSE'; } > } > // Add enclosed string > return (string) $element; $line .= $this->enclosure . $element . $this->enclosure; > } } >< * @param resource $pFileHandle PHP filehandle < * @param array $pValues Array containing values in a row> * @param resource $fileHandle PHP filehandle > * @param array $values Array containing values in a row< private function writeLine($pFileHandle, array $pValues)> private function writeLine($fileHandle, array $values): void< $writeDelimiter = false;> $delimiter = '';< foreach ($pValues as $element) { < // Escape enclosures < $element = str_replace($this->enclosure, $this->enclosure . $this->enclosure, $element); <> foreach ($values as $element) { > $element = self::elementToString($element);< if ($writeDelimiter) { < $line .= $this->delimiter;> $line .= $delimiter; > $delimiter = $this->delimiter; > // Escape enclosures > $enclosure = $this->enclosure; > if ($enclosure) { > // If enclosure is not required, use enclosure only if > // element contains newline, delimiter, or enclosure. > if (!$this->enclosureRequired && strpbrk($element, "$delimiter$enclosure\n") === false) { > $enclosure = '';< $writeDelimiter = true;> $element = str_replace($enclosure, $enclosure . $enclosure, $element); > }<< $line .= $this->enclosure . $element . $this->enclosure;> $line .= $enclosure . $element . $enclosure;< fwrite($pFileHandle, $line);> if ($this->outputEncoding != '') { > $line = mb_convert_encoding($line, $this->outputEncoding); > } > fwrite($fileHandle, $line);