From 75160b12821f7f4299cce7f0b69c83c1502ae071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Luka=20=C5=A0ijanec?= Date: Mon, 27 May 2024 13:08:29 +0200 Subject: 2024-02-19 upstream --- .../src/PhpSpreadsheet/Writer/Csv.php | 352 +++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php (limited to 'vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php') diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php new file mode 100644 index 0000000..b3a6de5 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php @@ -0,0 +1,352 @@ +spreadsheet = $spreadsheet; + } + + /** + * Save PhpSpreadsheet to file. + * + * @param resource|string $pFilename + */ + public function save($pFilename): void + { + // 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 + $this->openFileHandle($pFilename); + + 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($this->fileHandle, "\xEF\xBB\xBF"); + } + + if ($this->includeSeparatorLine) { + // Write the separator line if required + 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($this->fileHandle, $cellsArray[0]); + } + + $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 ',' + * + * @return $this + */ + public function setDelimiter($pValue) + { + $this->delimiter = $pValue; + + return $this; + } + + /** + * Get enclosure. + * + * @return string + */ + public function getEnclosure() + { + return $this->enclosure; + } + + /** + * Set enclosure. + * + * @param string $pValue Enclosure, defaults to " + * + * @return $this + */ + public function setEnclosure($pValue = '"') + { + $this->enclosure = $pValue; + + 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) + * + * @return $this + */ + public function setLineEnding($pValue) + { + $this->lineEnding = $pValue; + + 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 + * + * @return $this + */ + public function setUseBOM($pValue) + { + $this->useBOM = $pValue; + + 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 + * + * @return $this + */ + public function setIncludeSeparatorLine($pValue) + { + $this->includeSeparatorLine = $pValue; + + 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 + * Note that this overrides other settings such as useBOM, enclosure and delimiter + * + * @return $this + */ + public function setExcelCompatibility($pValue) + { + $this->excelCompatibility = $pValue; + + return $this; + } + + /** + * Get sheet index. + * + * @return int + */ + public function getSheetIndex() + { + return $this->sheetIndex; + } + + /** + * Set sheet index. + * + * @param int $pValue Sheet index + * + * @return $this + */ + public function setSheetIndex($pValue) + { + $this->sheetIndex = $pValue; + + return $this; + } + + private $enclosureRequired = true; + + public function setEnclosureRequired(bool $value): self + { + $this->enclosureRequired = $value; + + return $this; + } + + public function getEnclosureRequired(): bool + { + return $this->enclosureRequired; + } + + /** + * Write line to CSV file. + * + * @param resource $pFileHandle PHP filehandle + * @param array $pValues Array containing values in a row + */ + private function writeLine($pFileHandle, array $pValues): void + { + // No leading delimiter + $delimiter = ''; + + // Build the line + $line = ''; + + foreach ($pValues as $element) { + // Add 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 = ''; + } else { + $element = str_replace($enclosure, $enclosure . $enclosure, $element); + } + } + // Add enclosed string + $line .= $enclosure . $element . $enclosure; + } + + // Add line ending + $line .= $this->lineEnding; + + // Write to file + fwrite($pFileHandle, $line); + } +} -- cgit v1.2.3