You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Documented that ExcelSheet::writeRow()/writeCol() are non-atomic on libxl-side failure: PHP-side validation rejects the whole row or column before any cell is written, but a failure inside libxl can leave earlier cells committed.
Fixed
Stream-wrapper saves whose rename() is present but fails now also fail closed (destination left unchanged) instead of falling back to a truncating direct write. Only wrappers that omit rename() keep the warned fallback.
ExcelBook::save() to a local path no longer falls back to a truncating direct write when replacing the destination with the staged file fails. It now removes the staged file, warns that the destination was left unchanged, and returns false. Stream wrappers that do not implement rename() keep the previous direct-write fallback with its warning.
ExcelBook::load(), loadFile(), loadPartially(), loadFilePartially(), loadFileWithoutEmptyCells(), loadInfo(), and loadInfoRaw() no longer destroy the previously loaded workbook when the new load fails. The existing book and its live child wrappers survive a failed reload.
ExcelBook::save() to a local path now checks the staging-stream close result before handing the path to LibXL instead of saving over a failed reservation.
Failed handle creation (getSheet, sheet copies, fonts, formats, custom number formats, default font) and rejected header, footer, font-size, and staging inputs now emit warnings naming the cause instead of failing silently.
Changed
Stream-backed loads set a read timeout where the wrapper supports it, and bulk read and write loops now honor executor interruption. Wrappers without stream_set_option support are unaffected.