Skip to content

2.2.0

Choose a tag to compare

@iliaal iliaal released this 12 Jun 00:45
2.2.0
7983275

Added

  • PHP 8.1 support (lowered the minimum from 8.3).
  • ExcelFormat::AS_TEXT data type for ExcelSheet::write()/writeCol(): writes the string verbatim with no leading-quote stripping, no implicit formula promotion, and no numeric coercion. Use it when writing untrusted input to prevent formula injection.

Changed

  • The implicit "leading '=' becomes a formula" promotion now applies only when no data type argument is passed; an explicitly passed type (e.g. AS_NUMERIC_STRING) is honored instead of being overridden.

Fixed

  • excel.skip_empty was backed by an int global while OnUpdateLong stores a zend_long; the setting read as 0 on big-endian 64-bit. The field is now zend_long.
  • ExcelAutoFilter::getRef() returned rowLast as col_first and colFirst as row_last; the libxl call passed the output pointers in the wrong order.
  • ExcelAutoFilter::setRef() declared its parameters as (row_first, col_first, row_last, col_last) while the implementation reads (row_first, row_last, col_first, col_last); named-argument callers got rows and columns crossed. The signature now matches the implementation.
  • Methods on wrappers derived from a subclassed Excel class (e.g. class MyBook extends ExcelBook) failed with a spurious "handle is stale" warning; the book resolver now walks the parent chain with instanceof checks.
  • ExcelSheet::printArea() returned rowLast as col_start and colFirst as row_end; the libxl call passed the output pointers in the wrong order.
  • ExcelSheet::setNamedRange() declared its parameters as (row, col, to_row, to_col) while the implementation reads (row_first, row_last, col_first, col_last); the signature now matches, fixing named-argument callers.
  • ExcelFilterColumn::setTop10() required all three arguments despite the declared defaults; $top and $percent are now optional ($top defaults true).
  • ExcelFilterColumn::setCustomFilter() now accepts null for $value_2 and declares the -1/null no-second-criterion defaults; passing the previously documented defaults (0, "") warned and failed.
  • ExcelFont::name() crashed on a null name from libxl; it now returns false.
  • Declared defaults corrected to match behavior: addTable() $hasHeaders (true), rowColToAddr() relatives (true), named-range $scope_id (-1, workbook scope), setProtect() $enhancedProtection (-1, libxl default), setAutoFitArea() ends (-1, no limit).
  • Return types corrected for the stale-book error path: dataValidationSize() is int|false, the nine ExcelCoreProperties string getters are string|null|false.
  • The module now unregisters its INI entries at shutdown; previously they stayed registered after a dl-unload and dangled.