Skip to content

v4.5.0

Latest

Choose a tag to compare

@aVadim483 aVadim483 released this 08 Oct 17:08

Added

  • Explicit openXlsx(): Excel, openCsvBook(): CsvBook and openCsvReader(): CsvReader
    factories. CSV factories preserve the constructor options and accept empty CSV files.
  • CI coverage for Windows and the lowest supported Composer dependencies.

Fixed

  • Workbook relationship targets are resolved relative to the workbook part without stripping
    leading x/l characters. Absolute package paths and dot segments work; external relationships
    are not opened as internal parts, and paths escaping the package are rejected.
  • Both wrapText="1" and wrapText="true" are recognised.
  • String/stream writes detect incomplete writes and reported copy failures, close owned output
    streams even on exceptions, and remove temporary files on unsuccessful opening. Caller-owned
    input streams stay open and are not rewound. ZIP fallback preserves XML parser properties.
  • validate() restores the libxml error mode, collects this call's XML errors across all parts,
    supports special filenames through the ZIP fallback, and rejects missing required package parts.
    It clears the shared libxml diagnostic buffer before/after the call; it is not schema validation.

Compatibility and migration

  • openCsv() continues to return CsvReader in 4.x. A return type change to CsvBook is
    planned for 5.0. Use openCsvReader() for stable low-level access or openCsvBook() for
    the book/sheet API. Existing successful reads and factory signatures remain unchanged.
  • ext-dom is now an explicit Composer requirement: XLSX parsing already uses DOM through
    XMLReader::expand(). CSV/XLS-only installations without DOM must enable it before upgrading.
  • PHP remains >=7.4. Successful string/stream temporary files still live until process shutdown;
    this release does not add book-level close() or a disk-backed shared string cache.

Русский

Добавлено

  • Явные фабрики openXlsx(): Excel, openCsvBook(): CsvBook и openCsvReader(): CsvReader.
    CSV-фабрики сохраняют опции конструктора и допускают пустой CSV.
  • Проверки CI на Windows и минимальных поддерживаемых зависимостях Composer.

Исправлено

  • Пути relationships книги разрешаются относительно части workbook без удаления начальных
    символов x/l. Поддерживаются абсолютные пути внутри пакета и сегменты . и ..; внешние
    relationships не открываются как внутренние части, выход за корень пакета отклоняется.
  • Распознаются обе формы wrapText="1" и wrapText="true".
  • Запись строки/потока обнаруживает неполную запись и сообщённые ошибки копирования, закрывает
    собственные выходные потоки даже при исключениях и удаляет временные файлы при неудачном
    открытии. Входные потоки пользователя остаются открытыми, без rewind. ZIP fallback сохраняет
    свойства XML-парсера.
  • validate() восстанавливает режим libxml, собирает XML-ошибки текущего вызова по всем частям,
    поддерживает специальные символы в именах через ZIP fallback и отклоняет отсутствие
    обязательных частей пакета. Общий буфер libxml очищается до/после вызова; это не проверка схемы.

Совместимость и миграция

  • openCsv() продолжает возвращать CsvReader в 4.x. В 5.0 планируется возврат CsvBook.
    Для стабильного низкоуровневого API используйте openCsvReader(), для API книги и листа —
    openCsvBook(). Существующие успешные чтения и сигнатуры фабрик сохраняются.
  • ext-dom теперь явно указан в Composer: XLSX-парсер уже использует DOM через
    XMLReader::expand(). Установкам только для CSV/XLS без DOM потребуется включить его перед обновлением.
  • Минимальная версия PHP остаётся 7.4. Успешные временные файлы строки/потока живут до завершения
    процесса; этот релиз не добавляет close() книги или дисковый кэш общих строк.