Skip to content

v6.15.0

Latest

Choose a tag to compare

@aVadim483 aVadim483 released this 23 Jul 17:19

Added

  • A Style object can be created directly from an options array – new Style($options)
  • New method Excel::getSharedStringsRefCount()

Fixed

  • Reused DataValidation/Conditional objects – applying one object to several ranges kept only the last range (#137)
  • Sheet::setStateVeryHidden() made the sheet visible instead of very hidden
  • Sheet::writeCell() rejected the last valid row (1048576) and column (XFD)
  • Excel::rangeDimensionRelative() collapsed a range given as two associative points to a single cell
  • A cell value containing invalid UTF-8 was silently dropped (xmlSpecialChars() now uses ENT_SUBSTITUTE)
  • Numbers/dates under a comma LC_NUMERIC locale (e.g. de_DE) on PHP 7.4 produced invalid <v>3,14</v>
  • Style corruption when two workbooks are open in the same process (StyleManager read default-font state from the wrong instance)
  • Duplicate sheet names, and reuse of sheetN.xml after removeSheet() + makeSheet()
  • Missing XML escaping of image names, chart names and hyperlink targets/locations
  • Sheet::writeCells() dropped positional (integer-keyed) cell styles
  • Formulas with escaped quotes "" and national function names containing regex metacharacters
  • Shared strings lost leading/trailing spaces (xml:space="preserve")
  • Area::getOffsetAddress() ignored its offset argument
  • Sheet::skipRow(null) skipped no rows
  • PHP 8.1+ deprecations from strtolower()/htmlspecialchars() on non-string arguments
  • ZipArchive handle was not closed if saving threw an exception

Security

  • Excel::download() strips CR/LF and quotes from the file name (header injection), sends the correct xlsx MIME type, adds an RFC 5987 filename* and checks headers_sent()
  • Excel::loadImageFile() rejects dangerous stream wrappers (php://, phar://, glob://, zip://, data://, expect://, …)

Optimized

  • Formula conversion skips the heavy _xlfn/_xlws passes when the formula contains no (
  • sharedStrings.xml is streamed to disk instead of built entirely in memory (much lower peak memory when shared_string is enabled)
  • Sheet::writeRow() hot path

Changed

  • After removeSheet() + makeSheet(), new worksheet files use a monotonic index and never reuse a previous sheetN.xml